如何执行 SVD 来估算缺失值,一个具体的例子

机器算法验证 r 缺失数据 数据插补 svd
2022-03-01 05:24:04

在应用 SVD 之前,我已经阅读了有关如何处理缺失值的精彩评论,但我想通过一个简单的示例了解它是如何工作的:

        Movie1 Movie2 Movie3
User1     5             4
User2     2      5      5
User3            3      4
User4     1             5
User5     5      1      5

鉴于上面的矩阵,如果我删除 NA 值,我最终将只有 User2 和 User5。这意味着我的U将是 2 × k。但如果我预测缺失值,U应该是 5 × k,我可以将其与奇​​异值和V相乘。

你们中的任何人都会通过首先删除具有缺失值的用户然后应用 SVD 来填充上面矩阵中的缺失值吗?请对您应用的程序提供一个非常简单的解释,并使您的答案实用(即数字乘以另一个数字给出答案)而不是使用过多的数学符号。

我已阅读以下链接:

stats.stackexchange.com/q/33142

stats.stackexchange.com/q/31096

stats.stackexchange.com/q/33103

3个回答

SVD 仅针对完整矩阵定义。因此,如果您坚持使用普通 SVD,您需要在之前填写这些缺失值(SVD 本身不是一种插补算法)。您引入的错误有望被您的矩阵分解方法消除(一般假设:数据是由低秩模型生成的)。

像你想做的那样删除完整的行是很糟糕的。即使将缺失值设置为零也会更好。

有许多插补策略,但在这种情况下,我会用列平均值(或者可能是行平均值)来插补。这基本上是您在第二个链接中推荐的策略。

        Movie1 Movie2 Movie3
User1   5             4
User2   2      5      5
User3          3      4
User4   1             5
User5   5      1      5

变为(列均值;电影的平均得分)

        Movie1 Movie2 Movie3
User1   5      3      4
User2   2      5      5
User3   3      3      4
User4   1      3      5
User5   5      1      5

还有一点:你应该预处理数据。至少从所有值中减去平均值!

看看这个介绍它提到了 impute+SVD 方法,还讨论了更直接的缺失值建模。但在这种情况下,使用了其他算法。

本文详细介绍了您正在寻找的内容(使用软阈值 SVD)。就像 Geoffrey 指出的那样,他们通过编写自己的成本函数来做到这一点,该函数不包括任何针对缺失值的预测。

摘要:Mazumdar 等人使用凸松弛技术为大规模矩阵完成问题提供了一系列正则化低秩解决方案。算法 SOFT-IMPUTE 迭代地用从软阈值 SVD 获得的元素替换缺失的元素。利用问题结构,他们表明该任务可以在矩阵维度中以线性顺序的复杂性执行。该算法很容易扩展到大型矩阵;例如,它在 3.3 小时内符合 Netflix 完整训练集的 rank-95 近似值。与其他具有竞争力的最先进技术相比,这些方法实现了良好的训练和测试错误,并且具有优越的时间。

@article{mazumder2010spectral, title={用于学习大型不完全矩阵的光谱正则化算法}, author={Mazumder, Rahul and Hastie, Trevor and Tibshirani, Robert}, journal={Journal of machine learning research}, volume={11},编号={8 月},页数={2287--2322},年份={2010} }

有很多方法可以预测缺失值,但经典的 SVD 不是其中之一。好消息是机器学习现在提供了许多方法来做到这一点,其中一些基于矩阵分解,另一些则与矩阵分解完全不同。您可以选择并制作一个完全自定义的模型,现在通常这样做,因为这些工具现在已经足够强大了。矩阵分解当然仍然是预测稀疏数据中缺失值的好方法,但 SVD 本身不是。

这里接受的答案显然是建议提问者只选择任何常数值,例如 0 或 99 或 -3 或其他任何值,以预先分配给缺失值,然后对其运行 SVD。如果目标是在稀疏数据集上进行预测,这是一个糟糕的答案。但是,如果 OP 的目标只是运行 SVD,那么预先分配任何常量值都可以正常工作,因此如果结果对 OP 无关紧要,请选择任何值然后运行 ​​SVD。我说 SVD 是预测缺失值的糟糕解决方案,因为假设所有稀疏位置中的恒定值最终可能会导致您引入比已知的良好数据点更多的噪声点。

学习噪音有什么意义?当练习的目的是预测它们是什么时,为什么你甚至会建议缺失值实际上是相同的常数值?您不会期望缺失值真的完全相同,对吗?一方面,如果数据集中存在如此普遍的恒定数据,这将低估产生的主成分的数量。这也是一个非常容易预测的问题。您不需要学习算法甚至分解算法。你刚才说缺失值是一个已知的常数。无需推算!您已经手动完成了,只需猜测老式的方式。

您可以通过 SVD 获得更高级的信息,并使用随机分布预先估算缺失值,该随机分布是使用已知(非缺失)数据的均值和标准差凭经验得出的。但是随后数据中存在随机性而不是模式,并且您可能期望该技术固有的矩阵分解和降维来找到您期望的模式。但是,您不会在随机噪声中发现许多有用的模式,因此使用这种方式也无济于事。

底线是,只要有大量调查员提供的垃圾数据输入,SVD 或任何其他算法的输出将在很大程度上是垃圾。没有算法可以从大多数垃圾数据中学习一个好的模型。对整个“方法”说不。

OP 的目标似乎很可能是预测,并使用矩阵分解设计作为学习算法的一部分。在这种情况下,好消息是您可以编写自己的成本函数,该函数关键地省略了成本,即针对缺失值所做的任何预测。通过这种方式,任何垃圾数据都不会输入到学习算法中。使用良好的基于​​梯度下降的优化器,例如 Adam(还有其他)。只要您遵循良好的机器学习项目方法论,您就可以获得一个在训练、开发和测试数据集方面无论在何种程度上都非常准确的解决方案。随意向您的模型添加术语和复杂性,例如用户偏差、项目偏差、全局偏差、正则化或任何其他您需要控制偏差误差和方差误差到项目要求和可用数据集的东西。

现代机器学习开发包现在使它成为一种实用的方法。例如,TensorFlow(或 Microsoft CNTK 等人)可以帮助您完全按照我在使用矩阵分解模型的稀疏数据集上所描述的那样做。