我有一个50,000 x 50,000的密集矩阵或更大的矩阵。如果我使用numpy或scipy-package,则所有本征向量的条目均为0。如果我使用scipy.sparse仅计算1000-8000个本征向量,则将得到正确的本征向量。但是我需要所有这些。
这可能是内存问题吗?或发生此问题的原因是什么?我可以使用LAPACK或ARPACK计算正确的特征向量吗?
[请注意,我的矩阵是networkx图的表示,因此是稀疏矩阵。我将其转换为密集矩阵以使用numpy.linalg
,否则我将使用scipy.sparse.linalg
。
scipy.linalg.eig()
和scipy.linalg.eig()
依赖于LAPACK的例程numpy.linalg.eig()
。 LAPACK numpy.linalg.eig()
和scipy.linalg.eig()
利用scipy.linalg.eig()
计算密集矩阵的所有特征值和特征向量。首先,使用DGEEV()
将矩阵简化为上Hessenberg形式,然后在DGEEV()
中执行QR迭代。在DGEEV()
中,首先对矩阵进行平衡和缩放。
另一方面,DGEEVX()
和QR algorithm依赖ARPACK函数,在稀疏矩阵上实现dgehrd()
和dhseqr()
。两者都是幂方法的改进,并且在以提高的精度计算最大特征值/特征向量方面非常有效。如果Ax = b可以快速求解,则这些迭代方法在找到最小的特征值/特征向量或给定值附近的特征值/特征向量时也非常有效。
DGEEVX()
中解释了这些方法之间的差异。...而Arnoldi迭代基于矩阵的QR因式分解(33.7),其列为b,A b,...,A ^ {n-1} b,同时迭代和QR算法为基于列为A ^ n e_1 ...,A ^ n e_n的矩阵的QR分解(28.16)。
[从实际的角度来看,总是将Arnoldi迭代应用于检索有限数量的特征向量,这些特征向量显着低于矩阵的大小。不过,如果特征值均具有有限的多重性,则可以恢复所有特征向量。应通过分离特征值并跟踪其多重性来避免电位差重复。
scipy.sparse.linalg.eigs()
或scipy.sparse.linalg.eigs()
的自变量scipy.sparse.linalg.eigsh()
可以找到scipy.sparse.linalg.eigsh()
附近的内部特征值和特征向量。因此,可以使用不同的Implicitly Restarted Arnoldi Method多次调用Implicitly Restarted Lanczos Method。
使用Lloyd N. Trefethen and David Bau, NUMERICAL LINEAR ALGEBRA, Lecture 33. The Arnoldi Iteration的基本调用写道:
sigma
如果矩阵是埃尔米特半这是一个基于您先前删除的帖子的示例代码,该代码计算正半定稀疏矩阵的所有特征值。由于特征值都是实数和正值,因此scipy.sparse.linalg.eigs()
逐渐增加以找到所有特征值:
scipy.sparse.linalg.eigs()
对于具有真实正负特征值的埃尔米特矩阵,正负西格玛值都应进行研究。如果矩阵不是Hermitian,则特征值可能不是实数,并且将选择复平面上的scipy.sparse.linalg.eigsh()
值。首先搜索scipy.sparse.linalg.eigsh()
的最大特征值的幅度会将区域限制为磁盘。
建议的方法非常慢,可能并不总是有效。使用1Go内存,它对于20000x20000矩阵仅工作一次。