NumPy SVD 中的内存错误

3

我正在执行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)呢?

增加更多的内存,或者将数组存储在磁盘上。 - M4rtini
我已经有4GB的RAM了,还有其他方法吗? - sam
1
你的操作系统/Python版本是什么?因为如果你在64位Windows上使用32位Python运行代码,内存限制是2GB。此外,“A”的数据类型是什么? - Vincent
2
我在询问 type(A[0,0])。假设它是 int64。那么 A、U 和 V 每个都需要 8*10000**2 字节。这意味着你至少需要 2288 MB。再加上 Python 解释器和其他变量。也许 svd 函数还需要缓存一些数据。尝试减小 A 的大小,进行一些实验,然后你就会知道需要添加多少交换空间。 - Vincent
获取一个10000乘以10000矩阵的奇异值分解有什么目的? 通常,这个问题可以通过数学方法来解决。 例如,如果10000乘以10000的矩阵是10000乘以x(=A)和x乘以10000(A')的乘积,其中x << 10000,则可以通过A' x A进行SVD求解,这是一个x乘以x的矩阵。 - emesday
显示剩余3条评论
2个回答

1

一些小提示:关闭计算机上所有其他打开的程序。通过将不再需要的变量设置为None来删除程序中所有不必要的消耗内存的内容。例如,如果你之前使用了一个大字典D进行计算,但现在不再需要它,请设置D = None。尝试使用dtype=np.int32或dtype=np.float32对numpy数组进行初始化以降低内存需求。

根据你需要进行SVD的情况,你也可以查看Python的scikit-learn软件包,它支持许多分解方法,如PCA和SVD,还支持稀疏矩阵。


0

有一种轻量级的SVD实现,称为thin-SVD。当您的基础矩阵近似低秩时,它会被使用。考虑到您的矩阵的维度,由于一篇名为“为什么大数据矩阵近似低秩?”的论文指出,几乎所有的大矩阵都是低秩的,因此,thin-SVD可以通过不计算所有奇异值及其奇异向量来解决这个问题。相反,它旨在找到最高的奇异值。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接