具有缺失值的矩阵的 SVD

机器算法验证 svd 推荐系统
2022-03-07 22:42:30

假设我有一个 Netflix 风格的推荐矩阵,并且我想构建一个模型来预测给定用户的潜在未来电影评分。使用 Simon Funk 的方法,可以使用随机梯度下降来最小化完整矩阵和逐项 * 用户逐用户矩阵与 L2 正则化项之间的 Frobenius 范数。

在实践中,人们如何处理推荐矩阵中的缺失值,这是进行计算的重点?我阅读 Simon 的博客文章的猜测是,他只使用非缺失项(由(比如说)约 1% 的推荐矩阵组成)来构建模型(对超参数和正则化进行一些明智的选择)来预测矩阵的其他 99%?

在实践中,你真的跳过所有这些值吗?还是在进行随机梯度下降之前尽可能多地推断?处理缺失值的一些标准最佳实践是什么?

3个回答

是的,实际上这些值被跳过了。在您对 Frobenius 范数的描述中,这对应于最小化可以测量的范数分量,即那些具有已知评级的分量。正则化项可以看作是特征向量分量的贝叶斯先验,SVD 计算最大似然估计量,受此先验和已知值的影响。

最好将 SVD 视为一种推断缺失值的方法。如果您已经有了更好的方法,为什么还需要 SVD?如果您不这样做,那么 SVD 将很乐意为您填补空白。

有一篇论文回顾了许多推荐系统并进行了比较,但没有讨论对缺失项目的长期跟踪,例如,测试预测。这是你问题的一部分吗?以这种方式使用时间组件?在众多论文和方法中,论文评论的是时间感知/敏感系统,例如 Rendle 论文中的研究。如果您的问题也是关于处理稀疏数据的问题,这也在整个论文中进行了详细讨论,并且有很多方法。稀疏矩阵和归零或矩阵分解添加了用户聚类的链接矩阵(对项目进行类似评价的用户)或项目聚类的链接矩阵。

论文题目是 Evgeny Frolov 的“Low Rank Models for Recommender Systems with Limited Preference Information” https://www.skoltech.ru/app/data/uploads/2018/09/Frolov_Dissertation_Final1.pdf

在实践中,人们如何处理推荐矩阵中的缺失值,这是进行计算的重点?通过阅读 Simon 的博客文章,我猜想他只使用非缺失项来构建模型。

没错——这就是他和你的模型的重点,预测缺失的项,对吗?这是许多人实际上忘记的关键点。他们认为他们可以“假设”为丢失的数据预先分配一个常量,而无需关心世界,并且事情会神奇地从 SVD 中很好地解决。垃圾进,垃圾出:这是真的,你最好看。如果您希望得到有用的结果,最好不要将垃圾数据提供给模型。

在多数稀疏数据集上“最好推断出任何缺失值”当然不是“最好的”,然后在其上运行 SVD,希望能为您估算值(在运行 SVD 之前您已经估算过,对吧?)。你怎么看,模型是魔法?克服大多数垃圾数据既没有魔法也没有技术。当数据根本不真实时,您不能对模型说数据是真实数据,而实际上只是一些您凭空捏造的垃圾。

SVD 还做了其他有用的事情,所以我当然不是说 SVD 至少一文不值。继续并仅在完整数据集上使用 SVD,也许您已经在已经使用机器学习模型的情况下智能地估算了缺失值,并在其开发过程中充分注意偏差误差和方差误差。

机器学习是方法。因此,如果您仍然想知道如何使用矩阵分解设计来估算值,那么使用机器学习肯定有很好的方法可以做到这一点,而且重要的是它们不会将任何垃圾数据提供给模型以无意义地尝试学习。

斯坦福在线课程挖掘海量数据集的讲师在模块 5 中很好地介绍了这种机器学习矩阵分解模型。他们向您展示了数学并解释了模型。不过,他们不会为您编写代码。

没关系,因为如果您了解基本的机器学习,您可以自己编写代码。你知道什么是损失函数和成本函数吗?正则化?梯度下降?你对矩阵乘法和加法好吗?偏差误差和方差误差?如果是这样,那么你很好。如果没有,那么您应该考虑在 Coursera 上学习 Andrew Ng 的在线课程机器学习,这是许多好的起点之一。然后还可以参加在线课程挖掘海量数据集,该课程准确地讨论了矩阵分解和机器学习以制作推荐模型。

可以这么说,您可以完全设计和编写自己的分解模型,该模型可以很好地处理丢失的数据,就像 Simon Funk 所做的那样,您可以从头开始,但不再像以前那样难了在他那个时代,因为现在您可以使用 TensorFlow 或 Microsoft CNTK 之类的工具,这对您有很大帮助。定义损失函数和成本函数,选择优化器,从实际可用的数据(标记数据)中将数据集划分为训练、开发、测试并让它运行。说真的,它有效。调试 TF 及其图形构建错误并不容易,但它最终可以很好地工作,并且只需要不到一页的代码。

具体来说,不将虚假数据提供给矩阵分解机器学习模型的一种方法是在损失函数和成本函数中跳过缺失数据的矩阵元素