3
我正在使用scipy.sparse.linalg.eigsh来解决非常稀疏矩阵的广义特征值问题,并且遇到内存问题。矩阵是一个有100万行/列的正方形矩阵,但每行只有大约25个非零条目。有没有办法在不将整个矩阵读入内存的情况下解决问题,即一次只处理内存中的矩阵块?计算Python中稀疏矩阵的广义特征值
如果解决方案涉及到在python或java中使用不同的库,那没关系。
我正在使用scipy.sparse.linalg.eigsh来解决非常稀疏矩阵的广义特征值问题,并且遇到内存问题。矩阵是一个有100万行/列的正方形矩阵,但每行只有大约25个非零条目。有没有办法在不将整个矩阵读入内存的情况下解决问题,即一次只处理内存中的矩阵块?计算Python中稀疏矩阵的广义特征值
如果解决方案涉及到在python或java中使用不同的库,那没关系。
对于ARPACK,您只需要编写计算某些矩阵向量乘积的例程。这可以以你喜欢的任何方式实现,例如从磁盘读取矩阵。
from scipy.sparse.linalg import LinearOperator
def my_matvec(x):
y = compute matrix-vector product A x
return y
A = LinearOperator(matvec=my_matvec, shape=(1000000, 1000000))
scipy.sparse.linalg.eigsh(A)
请查看scipy.sparse.linalg.eigsh文档以了解广义特征值问题情况下需要的内容。
Scipy ARPACK接口或多或少暴露了完整的ARPACK接口,所以我怀疑你会通过切换到FORTRAN或其他方式访问Arpack获得很多收益。
不幸的是,它看起来像你已经在使用ARPACK。你可能不得不去FORTRAN执行ARPACK,或者使用ARPACK ++来获得你需要的细粒度内存控制... – brentlance
你有没有试过[Shift-invert mode?](http://docs.scipy .org/doc/scipy/reference/tutorial/arpack.html)。另外,你是否真的需要所有的特征值(你可以计算最大值)? – lucasg