Perron-Frobenius特征向量的数值计算

计算科学 线性代数 本征系统
2021-12-05 20:48:42

我想有效地(尽可能)可靠地找到非负矩阵的 Perron-Frobenius 特征向量。这些不是随机矩阵,它们通常是密集的,并且它们的条目相差许多数量级。它们可能通常是不可约的,但如果您认为非常小的条目为零,它们将不会是。它们不是对称的。它们将尽可能大,我可以在笔记本电脑上以合理的计算时间制作它们。

我不是一个数字人,到目前为止,我倾向于将特征向量例程视为“后备箱”。但是,在这种情况下,我尝试过的现成解决方案都不能很好地工作。linalg.eig对于大于 的矩阵,Numpy 的速度非常慢2000×2000左右,大概是因为它总是计算每个特征向量,而不仅仅是顶部的。此外,具有最大实部的特征值通常不对应于具有所有非负(甚至实数)条目的特征向量,这会搞砸一切。另一方面,scipy.sparse.linalg.eigs它在工作时很棒(尽管我的矩阵很密集),但有时无论我做什么,我都无法让它收敛。

我尝试自己实现幂迭代,但它非常慢,而且还存在收敛问题——这让我觉得真的应该有更好的方法。

理想情况下,我想要一个具有以下属性的算法:

  • 比幂次迭代更快并且具有更好的收敛性
  • 能够在无法收敛的情况下给我某种​​近似解决方案
  • 保证不给我除 Perron-Frobenius 之外的任何特征向量,即不给我具有复杂元素或正负混合的东西
  • 能够同时计算左右 Perron-Frobenius 特征向量,如果这比简单地运行两次更有效的话
  • 要么是现成的(用 Python 或其他语言),要么以我作为非数字人可以理解如何实现它而不必过多担心其背后的理论的形式进行解释

这样的事情存在吗?也欢迎参考文献提供如何解决此类问题的概述,因为我确信我不是第一个需要这样做的人。

1个回答

使用的算法eigs称为Arnoldi 迭代(在移位和反转模式下)。您可以将其视为进行逆幂迭代的一种复杂方法。

逆幂迭代法的工作原理如下:如果一个是你的矩阵,你知道 Perron 根(光谱半径一个) 是λ,然后在矩阵上进行幂次迭代=(一个-λ一世)-1, 在哪里一世是单位矩阵,将收敛到 Perron-Frobenius 特征向量一个,我们称之为v,比简单的幂迭代快得多一个. 这是因为v是最大特征值的特征向量,通过构造将接近无穷大,因此远大于下一个最大的特征值。

你仍然需要获得一个估计λ但是您可以为此目的使用Gershgorin 圆定理或使用其他技术(例如 [Duan2013] 中给出的界限)。

因此,我的建议是使用类似的东西:

v = np.ones(A.shape[0])
eigenvalues, eigenvectors = linalg.eigs(A, k=2, sigma=shift, which='LM', v0=v)

其中变量shift等于您的估计λ. 然后检查得到的特征值是否相距足够远,并选择对应于 Perron 根的特征向量。

请注意,如果矩阵不可约,您将得到多个与最大特征值对应的特征向量。还要注意,即使涉及矩阵逆,几乎没有必要(或方便)实际计算逆。

[Duan2013] Duan, X., & Zhou, B. (2013). 非负矩阵光谱半径的锐界。线性代数及其应用,439(10),2961-2970。http://doi.org/10.1016/j.laa.2013.08.026