应用SVD会立即抛出内存错误



我试图在一些文本处理后获得的矩阵(3241 x 12596)上应用SVD(执行潜在语义分析的最终目标),我无法理解为什么会发生这种情况,因为我的64位机器有16GB RAM。在调用svd(self.A)的那一刻,它抛出一个错误。精确的误差如下:

Traceback (most recent call last):
  File ".SVD.py", line 985, in <module>
    _svd.calc()
  File ".SVD.py", line 534, in calc
    self.U, self.S, self.Vt = svd(self.A)
  File "C:Python26libsite-packagesscipylinalgdecomp_svd.py", line 81, in svd
    overwrite_a = overwrite_a)
MemoryError

所以我试着用

self.U, self.S, self.Vt = svd(self.A, full_matrices= False)

,这一次,它抛出以下错误:

Traceback (most recent call last):
  File ".SVD.py", line 985, in <module>
    _svd.calc()
  File ".SVD.py", line 534, in calc
    self.U, self.S, self.Vt = svd(self.A, full_matrices= False)
  File "C:Python26libsite-packagesscipylinalgdecomp_svd.py", line 71, in svd
    return numpy.linalg.svd(a, full_matrices=0, compute_uv=compute_uv)
  File "C:Python26libsite-packagesnumpylinalglinalg.py", line 1317, in svd
    work = zeros((lwork,), t)
MemoryError

这应该是一个Numpy无法处理的大矩阵吗?在这个阶段,我可以在不改变方法本身的情况下做些什么吗?

是的,full_matrices参数到scipy.linalg.svd是重要的:您的输入是高度缺乏秩的(最大秩为3,241),所以您不想为V分配整个12,596 x 12,596矩阵!

更重要的是,来自文本处理的矩阵可能非常稀疏scipy.linalg.svd是密集的,不提供截断的SVD,这导致a)悲惨的性能和b)大量的内存浪费。

看一下PyPI的sparseSVD包,它处理稀疏输入,您可以只请求顶级K因子。或者尝试scipy.sparse.linalg.svd,尽管它不是那么有效,并且只能在较新版本的scipy中使用。

或者,为了完全避免粗糙的细节,可以使用透明地为您执行有效LSA的包,例如gensim。

显然,由于@Ferdinand Beyer,我没有注意到我在64位机器上使用的是32位版本的Python。

使用64位版本的Python并重新安装所有库解决了这个问题。

最新更新