numpy svd中的内存错误

时间:2014-01-17 07:34:43

标签: python numpy scipy

我正在表演numpy svd

U, S, V = np.linalg.svd(A) 

A的形状是:

(10000, 10000)

由于尺寸较大,它会给我内存错误:

U, S, V = np.linalg.svd(A, full_matrices=False) # nargout=3
File "/usr/lib/python2.7/dist-packages/numpy/linalg/linalg.py", line 1319, in svd
    work = zeros((lwork,), t)
    MemoryError

然后如何为我的矩阵找到svd?

2 个答案:

答案 0 :(得分:1)

一些小技巧: 关闭计算机上打开的所有其他内容。通过将不再需要的变量设置为None,删除程序中所有不必要的内存。假设您之前使用过大的dict D进行某些计算但不再需要它设置D = None。尝试使用dtype = np.int32或dtype = np.float32初始化numpy数组以降低内存要求。

根据您需要的SVD,您还可以查看python的scikit-learn包,它们支持许多分解方法,如PCA和SVD以及稀疏矩阵支持。

答案 1 :(得分:0)

SVD有一个简单的实现,称为Thin-SVD。当您的基本矩阵大约为低阶时使用。考虑到矩阵的维数,很可能它是低秩矩阵,因为根据题为“为什么大数据矩阵为何近似于低秩?”的论文,几乎所有大矩阵都是低秩的。因此,Thin-SVD可能不通过计算所有奇异值及其奇异矢量来解决此问题。而是旨在找到最高的奇异值。

要找到相应的实现,可以搜索:sklearn.decomposition.TruncatedSVD¶