【问题标题】:The fastest way to calculate eigenvalues of large matrices计算大型矩阵特征值的最快方法
【发布时间】:2023-04-11 09:13:01
【问题描述】:

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

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

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

【问题讨论】:

  • 如果 python 不是必须的,那么任何其他低级语言(C++ / 甚至 C#)都会给你速度提升。只是一个合适的实现的问题。
  • 无论您做什么,请记住,很多numpy 是一个Python 友好的包装器,围绕用C、Fortran、汇编器等语言编写的功能。我从文档中看到 numpy.linalg.eigvals 我是 LINPACK 库中函数的包装器。这并不意味着您找不到更快的求解器,但您可能需要超越 numpy、scipy 和 LAPACK 才能找到它们。
  • 你使用迭代方法吗?如果是这样,也许您可​​以将它们并行化?

标签: python performance sparse-matrix eigenvalue adjacency-matrix


【解决方案1】:

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

稀疏矩阵

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

带状矩阵

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

最大特征值

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

【讨论】:

  • OP 明确表示他们需要所有特征值,并且矩阵大约 80% 是稀疏的。我不知道 80% 的稀疏度是否足以让稀疏特征值算法胜过密集算法,但值得一试。
  • @Dougal 我知道他认为他需要所有的特征值,但我了解到,通常只能用最大的特征值进行很好的近似(原因很明显!)。 Lancozs 算法最终会收敛到越来越小的特征值上,而这个信息肯定比完全没有特征值要好!
  • 是的,对不起,我读得太快了你的答案部分,并假设你没有真正读过这个问题 - 抱歉。 :) 但是一个小提示:用户名“alice”和代词“he”通常不会放在一起。可能最好坚持性别中立singular they
  • @Dougal 我是谁来强制用户名的性别?但是,我认为 OP 是所有 Stack Exchange quieres 的正确代词。对english.stackexchange.com 来说也许是个好问题?
【解决方案2】:

在不更改代码的情况下(尤其是在多核机器上)获得可观加速的一种简单方法是将 numpy 链接到更快的线性代数库,如 MKL、ACML 或 OpenBLAS。如果您与学术机构相关联,优秀的Anaconda python 发行版将让您轻松免费链接到 MKL;否则,您可以支付 30 美元(在这种情况下,您应该先尝试 30 天的优化试用)或do it yourself(有点烦人的过程,但绝对可行)。

不过,我肯定也会尝试使用稀疏特征值求解器。

【讨论】:

    猜你喜欢
    • 2012-12-17
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 2018-10-25
    • 2012-08-23
    • 2011-03-08
    • 2019-06-09
    相关资源
    最近更新 更多