计算一般矩阵的最大特征值的最快方法是什么?

计算科学 线性代数 算法 本征系统 稀疏矩阵
2021-12-07 20:08:08

编辑:我正在测试是否有任何特征值的大小为 1 或更大。

我需要找到一个大型稀疏非对称矩阵的最大绝对特征值。

我一直在使用 R 的eigen()函数,它使用来自 EISPACK 或 LAPACK 的 QR 算法来查找所有特征值,然后我abs()用来获取绝对值。但是,我需要做得更快。

我也尝试过在igraphR 包中使用 ARPACK 接口。但是,它给我的一个矩阵带来了错误。

最终的实现必须可以从 R 中访问。

可能会有多个相同大小的特征值。

你有什么建议吗?

编辑: 准确度只需要1e-11. 到目前为止,“典型”矩阵是386×386我已经能够对其进行 QR 分解。但是,也可以有更大的。我目前开始阅读有关 Arnoldi 算法的信息。我知道它与Lanczsos有关。

EDIT2:如果我有多个要“测试”的矩阵,并且我知道有一个不变的大型子矩阵。是否可以忽略/丢弃它?

4个回答

这在很大程度上取决于矩阵的大小,在大规模情况下还取决于它是否稀疏,以及您想要达到的精度。

如果您的矩阵太大而无法进行单次分解,并且您需要高精度,Lanczsos 算法可能是最快的方法。在非对称情况下,需要 Arnoldi 算法,该算法在数值上不稳定,因此需要一个实现来解决这个问题(解决起来有些尴尬)。

如果您的问题不是这种情况,请在您的问题中提供更具体的信息。然后对此答案添加评论,我会更新它。

编辑:[这是问题的旧版本,最大特征值。]由于您的矩阵很小且显然很密集,我会在 B=(IA)^{-1} 上使用初始值进行 Arnoldi 迭代IA 的置换三角分解以得到 B 的廉价乘法。(或计算一个显式逆,但它的成本是分解的 3 倍。)您想测试 B 是否具有负特征值。使用 B 代替 A,负特征值可以更好地分离,因此如果有,您应该快速收敛。

但我很好奇你的问题来自哪里。非对称矩阵通常具有复杂的特征值,因此“最大”甚至没有明确定义。因此,您必须更多地了解您的问题,这可能有助于建议如何更快和/或更可靠地解决问题。

Edit2:很难与 Arnoldi 一起获得特定的兴趣子集。为了可靠地获得绝对最大的特征值,您将使用原始矩阵进行子空间迭代,子空间大小匹配或超过预期接近 1 或更大的特征值数量。在小矩阵上,这将比 QR 算法慢,但在大矩阵上,它会快得多。

幂迭代(或幂方法),例如 Dan所描述的,应该始终收敛,尽管速率为.|λn1/λn|

如果接近,它会很慢,但你可以使用外推来解决这个问题。它可能看起来很复杂,但论文中给出了伪代码的实现。λn1λn

最近对此进行了一些很好的研究。新方法使用“随机算法”,只需读取少量矩阵即可在最大特征值上获得良好的准确性。这与需要多次矩阵向量乘法才能达到高精度的幂迭代形成对比。

您可以在此处阅读有关这项新研究的更多信息:

http://math.berkeley.edu/~strain/273.F10/martinsson.tygert.rokhlin.randomized.decomposition.pdf

http://arxiv.org/abs/0909.4061

此代码将为您完成:

http://cims.nyu.edu/~tygert/software.html

https://bitbucket.org/rcompton/pca_hgdp/raw/be45a1d9a7077b60219f7017af0130c7f43d7b52/pca.m

http://code.google.com/p/redsvd/

https://cwiki.apache.org/MAHOUT/stochastic-singular-value-decomposition.html

如果您选择的语言不在其中,您可以很容易地滚动您自己的随机 SVD;它只需要矩阵向量乘法,然后调用现成的 SVD。

在这里,您将找到 Jacobi-Davidson (JD) 算法的算法介绍,该算法计算最大特征值(通过模数/绝对值)。

本文探讨了数学方面的问题。JD 允许使用一般(实数或复数)矩阵,并可用于计算特征值的范围。

在这里您可以找到各种库实现 JDQR 和 JDQZ(包括一个 C 接口,您应该能够从 R 链接到该接口)。