我正在表演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?
答案 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¶