部分奇异值分解 (SVD) 的内存高效实现

计算科学 线性代数 Python 参考请求 麻木的 svd
2021-11-29 05:41:49

为了减少模型,我想计算与矩阵的最大奇异值相关的左奇异向量 - 比如 20ARN,k, 在哪里N106k103. 不幸的是,我的矩阵A将是密集的,没有任何结构。

如果我只是svd从 Python 中的模块调用例程numpy.linalg以获得这种大小的随机矩阵,我会遇到内存错误。这是由于分配VRN,N为分解A=VSU.

是否有算法可以避免这个陷阱?例如,通过仅设置与非零奇异值相关的奇异向量。

我准备以计算时间和准确性进行交易。

4个回答

如果您只想要几个奇异值/向量,ARPACK应该可以解决问题。SVD 文档不是很好,而且这个分布是最新的。

编辑:如果您想在 python 中执行此操作,SciPy 有一个wrapper由于您的矩阵很密集,您可以尝试块稀疏行(BSR) 格式。

看看scikit-learn 0.14-rc中 的sklearn.decomposition.TruncatedSVD 。 (我相信 scikit-learn 的人会关注 stackoverflow.com/questions/tagged/scikit-learn,所以我会在那里提出详细的问题。)

(你有多少内存?106+3双打已经是8G了。)

也许你可以试试这个。

https://github.com/jakevdp/pypropack

这是 PROPACK 包的 Python 包装器,它实现了大型稀疏矩阵和线性运算符的高效部分奇异值分解。

英特尔 MKL 实施了新的 Jacobi-SVD 算法。以下是实施细节: http: //www.netlib.org/lapack/lawnspdf/lawn169.pdf http://www.fernuni-hagen.de/MATHPHYS/veselic/downloads/j02.pdf

和 LAPACK 例程: http: //software.intel.com/sites/products/documentation/hpc/mkl/mklman/GUID-732F9EE1-BCEC-4D9B-9B93-AF5499B21140.htm#DRMAC08-1

工作大小当然是可调的。您可以使用 Cython、SWIG 或任何其他包装机制轻松地从 Python 调用 C 函数。