使用Python库计算大型矩阵的部分奇异值分解的最快方法是什么?

使用Python库计算大型矩阵的部分奇异值分解的最快方法是什么?,python,numpy,tensorflow,scipy,svd,Python,Numpy,Tensorflow,Scipy,Svd,我有一个大的(500k x 300k)密集矩阵,我需要找到顶部约50个奇异值(高精度并不重要)和相应的奇异向量。我可以访问Amazon SageMaker实例,它使我能够使用高达256GB的RAM,但是矩阵占用了大约600GB,因此无法保存在内存中 为了避免这个问题,使用这个矩阵计算矩阵向量积是相当快的,并且可以使用Tensorflow并行化 我研究了一些相关问题,例如 但是,整个工作流是在Python/Tensorflow中实现的,因此使用R 首先,我尝试使用numpy.linalg.svd,

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

为了避免这个问题,使用这个矩阵计算矩阵向量积是相当快的,并且可以使用Tensorflow并行化

我研究了一些相关问题,例如 但是,整个工作流是在Python/Tensorflow中实现的,因此使用R

首先,我尝试使用
numpy.linalg.svd
,它可以利用多核执行,但是正如我所提到的,我无法将整个矩阵放入内存,我不需要完整的svd(这是唯一的选项,因为它使用LAPACK)

其次,我尝试了
scipy.sparse.linalg.svds
,它使用ARPACK并使用
LinearOperator
而不是矩阵。这解决了内存问题,但是这个ARPACK实现似乎对SVD使用了单个核(即使矩阵向量乘法在多个核上运行),因此速度非常慢。矩阵是稠密的这一事实使问题变得更糟

我真的很感激任何关于如何解决此类问题的意见。我可能忽略了
numpy
scipy
的一些内置功能,但我也愿意接受Python库中没有的其他实用算法,这些算法可能有助于解决内存问题,并且可以在合理的时间内(最多几天)完成这项工作。
提前谢谢你的回答

如果您还没有死心塌地地使用ScipyManager,那么为SVD测试其他几个软件包可能会有所帮助。核心之外的关键词可能是我研究的基础。如果您还没有死心塌地地使用ScipyManager,那么为SVD测试其他几个软件包可能会有所帮助。核心之外的关键词可能是我研究的基础。