为了减少模型,我想计算与矩阵的最大奇异值相关的左奇异向量 - 比如 20, 在哪里和. 不幸的是,我的矩阵将是密集的,没有任何结构。
如果我只是svd
从 Python 中的模块调用例程numpy.linalg
以获得这种大小的随机矩阵,我会遇到内存错误。这是由于分配为分解.
是否有算法可以避免这个陷阱?例如,通过仅设置与非零奇异值相关的奇异向量。
我准备以计算时间和准确性进行交易。
为了减少模型,我想计算与矩阵的最大奇异值相关的左奇异向量 - 比如 20, 在哪里和. 不幸的是,我的矩阵将是密集的,没有任何结构。
如果我只是svd
从 Python 中的模块调用例程numpy.linalg
以获得这种大小的随机矩阵,我会遇到内存错误。这是由于分配为分解.
是否有算法可以避免这个陷阱?例如,通过仅设置与非零奇异值相关的奇异向量。
我准备以计算时间和准确性进行交易。
看看scikit-learn 0.14-rc中
的sklearn.decomposition.TruncatedSVD 。
(我相信 scikit-learn 的人会关注
stackoverflow.com/questions/tagged/scikit-learn,所以我会在那里提出详细的问题。)
(你有多少内存?10双打已经是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 函数。