使用Python库计算巨大矩阵的部分SVD的最快方法是什么?

时间:2019-05-31 19:30:31

标签: python numpy tensorflow scipy svd

我有一个大的(500k x 300k)密集矩阵,需要为它找到顶部的近似值。 50个奇异值(高精度并不重要)和相应的奇异矢量。我可以访问Amazon SageMaker实例,这使我可以使用多达256GB的RAM,但是该矩阵占用了约600GB的空间,因此无法保存在内存中。

为避免此问题,使用Tensorflow使用此矩阵计算矩阵向量乘积相当快且可并行。

我研究了一些相关问题,例如https://stats.stackexchange.com/questions/41259/how-to-compute-svd-of-a-huge-sparse-matrix ,但是整个工作流程都是在Python / Tensorflow中实现的,因此使用R会产生巨大的开销。

首先,我尝试使用可以利用多核执行的numpy.linalg.svd,但是正如我提到的那样,我无法将整个矩阵放入内存中,并且不需要完整的SVD(这是唯一的选择)使用LAPACK。

第二,我尝试了scipy.sparse.linalg.svds,它使用ARPACK并采用LinearOperator而不是矩阵。这解决了内存问题,但是此ARPACK实现似乎将单个内核用于SVD(即使矩阵矢量乘法在多个内核上运行),因此非常慢。矩阵密集的事实使问题变得更加严重。

我非常感谢您提供任何通常如何解决此类问题的信息。我可能忽略了numpyscipy的某些内置功能,但是对于部分SVD可能会帮助解决内存问题的部分,我也愿意接受Python库中没有的其他实用算法。在合理的时间内完成工作(最多几天)。
谢谢您提前回答!

0 个答案:

没有答案