当您将 SVD 应用于协同过滤问题时会发生什么?两者有什么区别?

机器算法验证 机器学习 svd 推荐系统
2022-02-04 22:44:44

在协同过滤中,我们有未填写的值。假设用户没有看电影,那么我们必须在其中输入“na”。

如果我要对该矩阵进行 SVD,那么我必须在其中输入一些数字——比如 0。现在如果我分解矩阵,我有一种方法可以找到相似的用户(通过找出哪些用户在降维空间)。但是预测的偏好本身 - 用户对某个项目的偏好将为零。(因为那是我们在未知列中输入的内容)。

所以我陷入了协同过滤与 SVD 的问题。它们似乎几乎相同,但并不完全相同。

它们之间有什么区别,当我将 SVD 应用于协同过滤问题时会发生什么?我做到了,就寻找附近的用户而言,结果似乎是可以接受的,这很好,但是如何呢?

3个回答

好吧,当你说 SVD 时,大概你说的是截断的 SVD(你只保留个最大的奇异值)。有两种不同的方法可以查看矩阵的截断 SVD。一是标准定义:k

首先你做 SVD:,其中是旋转矩阵,而具有沿对角线的奇异值。然后选择前个奇异值,将其余奇异值归零,并删除不相关的行和列,以对原始值Xn×m=Un×nΣn×mVTm×mUVΣkkXX~=U~n×kΣ~k×kV~Tk×m

这一切都很好而且很花哨(并且很容易在 R 或 matlab 中实现),但是在谈论缺少值的矩阵时它没有意义。然而,截断 SVD 有一个有趣的特性——它是原始 k 秩的最佳那是:kk

X~=argminB:rank(B)=ki,j(XijBij)2

这个属性似乎很容易推广到缺失值的情况。基本上,您正在寻找一个秩矩阵,以最小化原始矩阵的已知条目中的元素均方误差。也就是说,当您训练系统时,您会忽略所有缺失值。(有关如何实际找到秩近似值的提示,这里一些地方可以查看)。kk

然后,一旦你想出了一个与原始值适当“接近”秩近似值,你就可以用它来填充缺失的值。也就是说,如果缺失,则填写多田!你现在完成了。kXijX~ij

似乎有很多关于如何处理缺失值的方法。以下第 1.3 节的评论可能是一个很好的起点。

我需要更多的声誉来评论 Stumpy Joe Pete 的答案,因此我将其发布为答案。

笨拙地感谢您的回答,尽管我认为它需要一些澄清。特别是我的意思是这句话:

基本上,您正在寻找一个 k 秩矩阵,该矩阵可以最小化原始矩阵已知条目的元素均方误差。

首先 - 最高排名不会总是最小化这个,或者实际上重建原始 X 矩阵?其次 - 你为什么只接受已知的条目。直觉上它是有道理的,但该过程实际上也适合用一些合理数字替换的空位。

我的方法是执行交叉验证之类的操作:

  1. 用 0 或平均值或其他合理数字填空。
  2. 将 n 个已知元素之一替换为 0 或合理数
  3. 进行秩 k 的 SVD 重建
  4. 检查已知重构元素的值。
  5. 对所有可能的已知元素重复并计算 MSE
  6. 对所有可能的 k 重复并选择 MSE 最低的一个。