计算大矩阵特征值的最快方法

ali*_*ice 6 python performance eigenvalue sparse-matrix adjacency-matrix

到目前为止,我使用 numpy.linalg.eigvals 来计算具有至少 1000 行/列的二次矩阵的特征值,并且在大多数情况下,其条目的大约五分之一非零(我不知道这是否应该被视为稀疏矩阵)。我发现另一个主题表明 scipy 可能会做得更好。

但是,由于我必须计算数十万个大小不断增加的大型矩阵的特征值(可能高达 20000 行/列,是的,我需要它们的所有特征值),因此这总是需要很长时间。如果我能加快速度,即使是最微小的一点,那很可能是值得的。

所以我的问题是:在不限制自己使用 python 的情况下,是否有更快的方法来计算特征值?

Hoo*_*ked 5

@HighPerformanceMark 在评论中是正确的,因为 numpy(LAPACK 等)背后的算法是一些最好的,但可能不是最先进的,用于对角化完整矩阵的数值算法。但是,如果您有以下条件,则可以大大加快速度:

稀疏矩阵

如果您的矩阵是稀疏的,即填充条目的数量是 k,k<<N**2那么您应该查看scipy.sparse.

带状矩阵

有许多算法可用于处理特定带状结构的矩阵。查看中的求解器scipy.linalg.solve.banded

最大特征值

大多数情况下,您并不真正需要所有特征值。事实上,大部分物理信息来自最大的特征值,其余的只是短暂的高频振荡。在这种情况下,您应该研究快速收敛到那些最大特征值/向量的特征值解决方案,例如Lanczos 算法

  • @Dougal 我知道他认为他需要所有的特征值,但我已经了解到,通常只能使用最大的特征值来进行很好的近似(原因很明显!)。Lancozs 算法最终会收敛到越来越小的特征值上,而这个信息**肯定**比根本没有特征值要好! (2认同)