应用SVD会立即引发内存错误?

Leg*_*end 6 python memory nlp numpy scipy

我试图在我的矩阵(3241 x 12596)上应用SVD,这是在进行一些文本处理后获得的(最终目标是执行潜在语义分析),我无法理解为什么会发生这种情况,因为我的64位机器有16GB内存.这个时刻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:\Python26\lib\site-packages\scipy\linalg\decomp_svd.py", line 81, in svd
    overwrite_a = overwrite_a)
MemoryError
Run Code Online (Sandbox Code Playgroud)

所以我尝试使用

self.U, self.S, self.Vt = svd(self.A, full_matrices= False)
Run Code Online (Sandbox Code Playgroud)

这次,它抛出以下错误:

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:\Python26\lib\site-packages\scipy\linalg\decomp_svd.py", line 71, in svd
    return numpy.linalg.svd(a, full_matrices=0, compute_uv=compute_uv)
  File "C:\Python26\lib\site-packages\numpy\linalg\linalg.py", line 1317, in svd
    work = zeros((lwork,), t)
MemoryError
Run Code Online (Sandbox Code Playgroud)

这应该是Numpy无法处理的大型矩阵吗?在这个阶段我能做些什么而不改变方法本身?

Rad*_*dim 10

是的,full_matrices参数scipy.linalg.svd是重要的:您的输入是高排名缺陷(排名最大3,241),因此您不希望分配整个12,596 x 12,596矩阵V!

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

看看PyPI 的sparseSVD包,它可以在稀疏输入上工作,你可以K只询问最重要的因素.或尝试scipy.sparse.linalg.svd,虽然这不是那么有效,只有较新版本的scipy可用.

或者,为了完全避免细节,请使用一个透明地为您提供高效LSA的软件包,例如gensim.


Leg*_*end 2

显然,事实证明,多亏了@Ferdinand Beyer,我没有注意到我在 64 位机器上使用了 32 位版本的 Python。

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