Funk SVD算法是如何在推荐引擎中工作的

Funk SVD算法是如何在推荐引擎中工作的

我将通过提出一个简单的问题来开始这篇博文:

如果您希望在部署之前了解推荐引擎​​的工作情况并在实际情况下使用它,该怎么办?

为了回答这个问题,我们需要一种非常流行的机器学习技术,称为奇异值分解或SVD。

SVD可以让我们预测每个user-item对的评级。所以你可能会问自己,为什么我们需要预测评级?我们只是想提出建议。事实上,如果我们可以预测低误差的评级,我们可以使用此预测评级来查找与预测的最高评级相关的item。这就是SVD可用的地方,因为它允许我们使用基于回归的指标(如MSE或MAE)来评估性能。通过这种方式,在将我们的建议部署到客户之前,要了解度量标准。

在执行SVD时,我们根据项目创建一个用户矩阵,并使用用户评级或其他东西对整个矩阵中的项目进行评估。这个矩阵没有关于用户或项目的特定信息,只有它们各自的id和关联的评级。在这个矩阵上使用SVD可以让我们发现与项目和用户相关的潜在特性。

什么是潜在因子?

在我们的数据中没有观察到潜在因子,而是我们根据用户对项目给出的值(评级)来推断它。假设一个用户给两部谈论人工智能的电影打了9/10的分数,给两部谈论动物的电影打了2/10的分数。分数和电影的内容(AI和狗)是有关系的。但是人工智能和狗不在我们的数据中,这些特征被称为潜在特征。

在现实生活中,SVD在数据上不能很好地工作。为什么呢?

因为SVD可以在非稀疏数据上获得非常好的结果,我的意思是在没有缺失值的数据上。但是我们当中有多少人会在每部电影或每次购物的最后都打分呢?不多。

事实上,真实的推荐引擎数据集可能非常稀疏,您可以找到具有95%以上NaN值的用户项矩阵。这就是Funk SVD的作用。

Funk SVD算法如何工作?

Funk SVD将忽略这些缺失值,并找到一种仅使用我们所知的值来计算潜在因子的方法。要使用Funk SVD实现矩阵分解的这种方法,这是要遵循的步骤:

1.根据所选择的潜在因子的数量和由这些相同的潜在因子的矩阵分别构建2个矩阵U和V ^ T,并用随机数填充矩阵。

在这一步,我们有3个矩阵:

Funk SVD算法是如何在推荐引擎中工作的

User-Item矩阵

Funk SVD算法是如何在推荐引擎中工作的

U矩阵(用户填充随机值的潜在因子)

Funk SVD算法是如何在推荐引擎中工作的

2.在User-Item矩阵中搜索一个User-Item对的现有值。第一个评级是9,由User1给出item3。所以9是我们的实际值,Actual。

3.在U矩阵中,我们获取与User1(行)相关的所有随机值。对于这个用户[0.8,1.2,-0.2]

请记住,9是由User1给出的item3.在V ^ T矩阵中,我们还获取与item3相关的所有随机值。我们对此item有[-0.2,0.1,0.14] ^ T

4.我们计算找到的行和列之间的点积,以便进行预测。(0.8×(-0.2))+(1.2×0.1)+( - 0.2×0.14)= -0.07

此时,我们有:Actual = 9 ; Predicted= -0.07

所以误差是(9 + 0.07)²= 82.26

5.使用梯度下降最小化误差。

公式:U(i) or V(i) + ⍺ 2(actual-predicted) x V(i) or U(i) ,其中U(i)是来自U矩阵的随机值,V(i)是随机值相关的V ^ T矩阵,⍺是学习率。

让我们回顾一下,这是从U和V取得的值并做出预测:

Funk SVD算法是如何在推荐引擎中工作的

使用梯度下降更新0.8并且⍺= 0.1:

New value = 0.8 + 0.1 x 2(9+0.07) x -0.2 = 0.44

通过更新U的所有值,我们得到0.44,1.38,0.053。所以现在我们有:

Funk SVD算法是如何在推荐引擎中工作的

然后我们可以从V中更新值。注意,从U中更新的新值已经影响了我们从V中计算的值。

最后,我们使用相同的公式:

Funk SVD算法是如何在推荐引擎中工作的

6.替换U和V ^ T矩阵中的更新值

Funk SVD算法是如何在推荐引擎中工作的

Funk SVD算法是如何在推荐引擎中工作的

这就完成了一次迭代。

结论

Funk SVD很容易让我们找到一种方法来评估我们的推荐引擎并创建好的U和V ^ T矩阵,以便即使我们有一个非常稀疏的矩阵也可以提出建议。但是SVD不应该单独使用,因为在推荐引擎中我们可能会遇到一个常见的问题,称为“Cold Start Problem”。这意味着我们不能为新用户或新电影提供推荐。一个好的方法是将Funk SVD与不太高级的方法(如基于排序的算法或基于内容的方法)结合起来。

相关推荐