如何计算巨大稀疏矩阵的 SVD?

机器算法验证 svd 数字
2022-01-28 02:31:31

计算数据极其稀疏的非常大的正矩阵(65M x 3.4M)的奇异值分解(SVD)的最佳方法是什么?

少于 0.1% 的矩阵是非零的。我需要一种方法:

  • 将适合记忆(我知道存在在线方法)
  • 将在合理的时间内计算:3,4 天
  • 将足够准确,但准确性不是我主要关心的问题,我希望能够控制我投入多少资源。

拥有一个实现它的 Haskell、Python、C# 等库会很棒。我没有使用 mathlab 或 R,但如有必要,我可以使用 R。

2个回答

如果它适合内存,请使用Matrix 包在 R 中构造一个稀疏矩阵,并尝试irlba用于 SVD。您可以指定结果中需要多少个奇异向量,这是限制计算的另一种方法。

这是一个相当大的矩阵,但过去我用这种方法取得了非常好的结果。 irlba是相当先进的。它使用隐式重启的 Lanczos 双对角化算法

它可以在几毫秒内浏览 netflix 奖品数据集(480,189 行 x 17,770 列,100,480,507 个非零条目)。你的数据集比 Netflix 数据集大约 200,000 倍,所以它需要的时间要长得多。期望它可以在几天内完成计算可能是合理的。

如果您愿意使用低秩近似(就像使用 Lanczos 类型算法和有限数量的奇异向量一样),另一种选择是随机 SVD您可以获得与 irlba 类似的准确性和计算工作量,但是实现要简单得多——如果没有可用的实现可以精确地处理您的情况,那么这是相关的。

如果你从一个矩阵开始并且你想要一个秩近似值,你需要能够将你的矩阵乘以一个密集矩阵,例如个条目,然后做一个普通的 SVD在得到的矩阵上。与 Lanczos 类型的算法一样,计算只使用矩阵进行乘法(它是一种“无矩阵”算法),因此它将利用稀疏性和其他结构。我的用例是遗传学,矩阵是稀疏矩阵和正交于低秩子空间的投影的乘积)N×MkM×(k+10)N×(k+10)