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


10

为了简化模型,我想计算与矩阵最大20个奇异值相关的左奇异矢量,其中和。不幸的是,我的矩阵将是稠密的,没有任何结构。 Ñ 10 6 ķ 10 3ARN,kN106k103A

如果我只是svdnumpy.linalgPython模块中的例程中调用该大小的随机矩阵,则会遇到内存错误。这是由于的分配用于分解。= V 小号ùVRN,NA=VSü

周围有避免这种陷阱的算法吗?例如,通过仅建立与非零奇异值关联的奇异矢量。

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


1
有趣的是,Numpy似乎不知道如何做一个薄的SVD ...
JM

感谢您的提示。实际上,numpy.linalg.svd具有full_matrices设置为False 的选项,以便仅计算“非零”部分。但是,有没有办法进一步减少计算量呢?
1

3
numpy后端使用Fortran代码,在 LAPACKE_dgesvd常规标准SVD。但是,通常您的矩阵是C_CONTIGOUS(检查matrix.flags)。因此,它将复制数据以进行fortran对齐。此外,在运行lapack例程dgesvd时,还需要矩阵的另一个副本(或者至少是它的内存)。如果确保从一开始就确保内存对齐为fortran样式,则可以删除一个副本。
2013年

Answers:



2

看看sklearn.decomposition.TruncatedSVDscikit学习 0.14 RC。
(我相信scikit学习者会遵循 stackoverflow.com/questions/tagged/scikit-learn,所以我会在那儿问详细的问题。)

(您有多少内存?10 6 + 3 doubles已经是8G。)6+3


感谢您的回答。到目前为止,我在scipy例程上做得很好。另外,我还没有达到,但是到了一半左右,这对于我的笔记本电脑仍然可行。如有必要,我可以使用具有32 GB RAM的工作计算机。106×103
1


2

英特尔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函数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.