推荐引擎的 SVD

数据挖掘 Python 推荐系统 相关性
2021-10-09 03:27:47

我正在尝试构建一个玩具推荐引擎来围绕奇异值分解(SVD)。我已经阅读了足够多的内容来理解矩阵 A(用户x电影矩阵)实际分解背后的动机和直觉。

我需要更多地了解之后发生的事情。

from numpy.linalg import svd
import numpy as np

A = np.matrix([ 
  [0, 0, 0, 4, 5],
  [0, 4, 3, 0, 0],
  ...
])
U, S, V = svd(A)

k = 5 #dimension reduction
A_k = U[:, :k] * np.diag(S[:k]) * V[:k, :]

三个问题:

  1. 矩阵的值是否A_k代表预测/近似评级?

  2. 余弦相似度在推荐中起什么作用/什么步骤?

  3. 最后,我使用平均绝对误差 (MAE) 来计算我的误差。但我在比较什么价值观?类似的东西MAE(A, A_k)还是别的什么?

2个回答

您可以使用 SVD 构建推荐引擎,但我认为这不是了解幕后情况的最佳方式。无论如何,这是一个包含更多详细信息的演示文稿,我建议您查看幻灯片 9

并回答您的问题:

  1. A_k表示用于预测用户评分矩阵的嵌入维度(即低秩近似)。

  2. 余弦相似度只是用户的点积i和项目j,它映射到用户的预测评分i和项目j. 点积将用户和项目定义为相似。

  3. A是的,您应该在和上使用 MAE A_k您可能更喜欢使用 MSE。这可以衡量您对用户的预测质量i和项目j. 请注意,这显然是矩阵的 MSE ,即 Frobenius 范数。

我认为理解 SVD 的更简单方法是将其应用于不同组件的图像压缩。请在此处查看此演示文稿

让我试着回答你的问题。

  1. aij(k) 矩阵的元素 Ak是一个近似值aij原始矩阵的元素A. 特别是,如果您要使用U, Σ, 和 V您将拥有的扩展矩阵(没有降维)aij(k)=aij. 作为推论,不可能使用Ak作为预测矩阵,因为您已经在矩阵中拥有此信息A. 例如,如果pth用户没有评价qth产品,apq将会0. 同时apq(k)将会0也。不是一个非常有见地的预测,是吗?

  2. 余弦相似度可以让您判断两个向量是否具有相同的方向,即它们的相似程度。现在让我们再次看一下 SVD 分解的组成部分。V定义隐藏产品的功能和ith矩阵的列V解决了ith产品。U定义用户如何对产品特定功能的存在或不存在做出反应。了解产品的特性后,您可以使用余弦相似度找到相似的产品。例如,第一个产品和第二个产品的相似度只是两者之间的余弦V的第一列和第二列。

  3. 在实施推荐引擎时,您应该多次使用平均绝对误差或均方误差。首先,如果你想执行降维,你需要找到k 其中的价值 MEAN(A,Ak)是合理的。下面将描述 MEAN 的第二种情况。

中期总结:你不应该使用 Ak对于预测,您应该使用扩展组件本身来查找类似产品。现在让我们将上述公式化为使用 SVD 实现朴素推荐引擎的算法。

  1. 分解原始矩阵 A 分成三个矩阵 U, Σ, 和 V.
  2. 了解隐藏功能 V,为每个产品找到它与所有其他产品的相似性。
  3. 为每个用户找到他或她已经评价高的产品。选择必要数量的与用户喜欢的产品相似的产品,并将它们作为推荐返回。

如果您将数据拆分为训练集和测试集,则可以通过计算引擎对测试集的预测与用户实际从中对产品的评分之间的平均值来检查您的预测。

在您可以找到相似用户而不是相似产品并推荐相似用户喜欢的产品的意义上,这种模式可以倒置。

希望这会有所帮助。