有很多方法可以预测缺失值,但经典的 SVD 不是其中之一。好消息是机器学习现在提供了许多方法来做到这一点,其中一些基于矩阵分解,另一些则与矩阵分解完全不同。您可以选择并制作一个完全自定义的模型,现在通常这样做,因为这些工具现在已经足够强大了。矩阵分解当然仍然是预测稀疏数据中缺失值的好方法,但 SVD 本身不是。
这里接受的答案显然是建议提问者只选择任何常数值,例如 0 或 99 或 -3 或其他任何值,以预先分配给缺失值,然后对其运行 SVD。如果目标是在稀疏数据集上进行预测,这是一个糟糕的答案。但是,如果 OP 的目标只是运行 SVD,那么预先分配任何常量值都可以正常工作,因此如果结果对 OP 无关紧要,请选择任何值然后运行 SVD。我说 SVD 是预测缺失值的糟糕解决方案,因为假设所有稀疏位置中的恒定值最终可能会导致您引入比已知的良好数据点更多的噪声点。
学习噪音有什么意义?当练习的目的是预测它们是什么时,为什么你甚至会建议缺失值实际上是相同的常数值?您不会期望缺失值真的完全相同,对吗?一方面,如果数据集中存在如此普遍的恒定数据,这将低估产生的主成分的数量。这也是一个非常容易预测的问题。您不需要学习算法甚至分解算法。你刚才说缺失值是一个已知的常数。无需推算!您已经手动完成了,只需猜测老式的方式。
您可以通过 SVD 获得更高级的信息,并使用随机分布预先估算缺失值,该随机分布是使用已知(非缺失)数据的均值和标准差凭经验得出的。但是随后数据中存在随机性而不是模式,并且您可能期望该技术固有的矩阵分解和降维来找到您期望的模式。但是,您不会在随机噪声中发现许多有用的模式,因此使用这种方式也无济于事。
底线是,只要有大量调查员提供的垃圾数据输入,SVD 或任何其他算法的输出将在很大程度上是垃圾。没有算法可以从大多数垃圾数据中学习一个好的模型。对整个“方法”说不。
OP 的目标似乎很可能是预测,并使用矩阵分解设计作为学习算法的一部分。在这种情况下,好消息是您可以编写自己的成本函数,该函数关键地省略了成本,即针对缺失值所做的任何预测。通过这种方式,任何垃圾数据都不会输入到学习算法中。使用良好的基于梯度下降的优化器,例如 Adam(还有其他)。只要您遵循良好的机器学习项目方法论,您就可以获得一个在训练、开发和测试数据集方面无论在何种程度上都非常准确的解决方案。随意向您的模型添加术语和复杂性,例如用户偏差、项目偏差、全局偏差、正则化或任何其他您需要控制偏差误差和方差误差到项目要求和可用数据集的东西。
现代机器学习开发包现在使它成为一种实用的方法。例如,TensorFlow(或 Microsoft CNTK 等人)可以帮助您完全按照我在使用矩阵分解模型的稀疏数据集上所描述的那样做。