大稀疏矩阵的所有特征向量均为零

问题描述 投票:2回答:1

我有一个50,000 x 50,000的密集矩阵或更大的矩阵。如果我使用numpy或scipy-package,则所有本征向量的条目均为0。如果我使用scipy.sparse仅计算1000-8000个本征向量,则将得到正确的本征向量。但是我需要所有这些。

这可能是内存问题吗?或发生此问题的原因是什么?我可以使用LAPACK或ARPACK计算正确的特征向量吗?

[请注意,我的矩阵是networkx图的表示,因此是稀疏矩阵。我将其转换为密集矩阵以使用numpy.linalg,否则我将使用scipy.sparse.linalg

python numpy scipy eigenvector arpack
1个回答
1
投票
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矩阵仅工作一次。
© www.soinside.com 2019 - 2024. All rights reserved.