我正在尝试在我的矩阵(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:\Python26\lib\site-packages\scipy\linalg\decomp_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:\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
这应该是Numpy无法处理的大型矩阵吗?在这个阶段我能做些什么而不改变方法本身?
答案 0 :(得分:10)
是的,full_matrices
scipy.linalg.svd
参数非常重要:您的输入缺乏排名(排名最高为3,241),因此您不希望为{分配整个12,596 x 12,596矩阵{1}}!
更重要的是,来自文本处理的矩阵可能非常稀疏。 V
密集且不提供截断的SVD,这导致a)悲剧性能和b)大量浪费的记忆。
查看来自PyPI的sparseSVD软件包,该软件包适用于稀疏输入,您只能询问最高scipy.linalg.svd
因素。或者试试K
,虽然效率不高,只能在较新版本的scipy中使用。
或者,为了完全避免细节,请使用能够透明地为您提供高效LSA的软件包,例如gensim。
答案 1 :(得分:2)
显然,事实证明,感谢@Ferdinand Beyer,我没有注意到我在64位计算机上使用的是32位版本的Python。
使用64位版本的Python并重新安装所有库解决了这个问题。