【发布时间】:2019-11-16 15:25:59
【问题描述】:
我想对一个大数组 M[159459,159459] 执行 SVD。
由于 SVD 计算依赖于形状 (159459,159459) 的输入矩阵,所以这个 here 不能满足我的目标。
我试过用:
scipy.linalg.svdscipy.linalg.svd(check_finite=False)- 把驱动改成
lapack_driver='gesvd numpy.linalg.svd
但是,我总是收到 MemoryError。最后,我想计算完整的 SVD,因为我想执行 Procrustes 分析,即如果 M 是我现在拥有的矩阵,我需要 M = USV'
import numpy as np
from scipy import linalg
#M = np.load("M.npy")
M = np.random.rand(159459,159459)
U, s, Vh = linalg.svd(M, check_finite=False, lapack_driver='gesvd)
一切都失败了。
我的系统详情:
$ cat /proc/meminfoMemTotal: 527842404 kBMemFree: 523406068 kBMemAvailable: 521659112 kB
【问题讨论】:
-
使用 NumPy 的 mmaps 而不是将输入加载到内存中是否有帮助? (如果您还没有这样做,但我不确定在 SVD 中发生了多少非就地计算)。当然,当使用 mmap 时,预计计算时间会大大延长。
-
这个我没试过。我去看看
-
对于一个小的近似 Procrustes 矩阵,看一下 scikit-learn 中的TruncatedSVD;以
n_components=1000左右开头。
标签: python numpy linear-algebra svd arpack