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


26

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

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

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

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


3
你有多少内存?65M * 3.4M的0.1%仍为221e9非零值。如果您每个值使用4个字节,那么在没有开销的情况下仍超过55 gb,因此稀疏性仍无法解决问题...您是否需要立即将整个集合加载到内存中?
2012年

我应该更精确一些。不超过250-500mb(32位整数)。可能少得多,但是据我所知,维数是问题。我有一台16GB的机器。
索尼娅(Sonia)2012年

这个怎么样?quora.com/…– 2012
按位

此页面链接到Python库,该库实现了“快速,增量,低内存,大矩阵SVD算法”:en.wikipedia.org/wiki/Latent_semantic_analysis
2012年

Answers:


21

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

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

它可以以毫秒为单位浏览netflix奖赏数据集(480,189行乘17,770列,100,480,507非零条目)。您的数据集比Netflix数据集大200,000倍,因此所需的时间要长得多。预期它可以在几天内完成计算可能是合理的。


数据矩阵适合内存,irlba也会以内存有效的方式处理分解吗?
索尼娅2012年

@Sonia:irlba的内存效率很高:它计算一个近似解,可以限制奇异矢量的数量,并且设计用于稀疏矩阵。据我所知,它与计算部分SVD的速度一样快。
Zach 2012年

@Sonia:祝你好运!
Zach

尝试一下-内存不足...在运行它之前,我将计算一个三角形块形式。
索尼娅

@Sonia是否将其存储为稀疏Matrix?尝试限制您计算的奇异值的数量...也许只是看看前10个?
Zach 2012年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.