计算一个非常大且非常稀疏的邻接矩阵的所有特征值

计算科学 线性代数 稀疏矩阵 特征值 矩阵
2021-12-15 01:43:41

我有两个图,每个图都有近 n~100000 个节点。在这两个图中,每个节点都恰好连接到 3 个其他节点,因此邻接矩阵是对称的并且非常稀疏。

困难的部分是我需要邻接矩阵的所有特征值,而不是特征向量。准确地说,这将是我一生中的一次(据我所知,至少!)所以我想获得所有特征值并且不介意等待几天才能获得它们。

我尝试scipy了 wrappers ARPACK,但它需要的时间太长了。我找到了多个库,但它们最适合获取最大/最小特征值的子集。是否有任何库适用于可能并行实现的对称稀疏矩阵以获取所有特征值?

2个回答

您可以使用移位反转频谱变换 [1] 并逐个频带计算频谱。

我的文章 [2] 中也解释了该技术。除了 [1] 中的实现之外,我的 Graphite 软件 [3] 1 月 17 日更新:现在所有内容都移植到 geogram/graphite 版本 3)中的 C++ 中提供了一个实现,我用它来计算拉普拉斯算子的特征函数具有多达 100 万个顶点的网格(与您的问题类似)。

怎么运行的:

这个想法是,如果是可逆的,那么如果的特征对,的特征对。ARPACK 中的迭代方法对于计算大特征值(高频)非常有效,但对于小特征值(小频率)则效率低得多。因此,当需要计算小频率时,将替换为是一个好主意。现在,由于 ARPACK 只需要计算矩阵向量乘积,因此不需要真正反转:可以改为分解它(例如使用稀疏 LU 或稀疏分解),然后求解A(V,λ)A(V,1/λ)A1AA1ALLtAx=b每当 ARPACK 要求矩阵向量乘积时。这是“反转”变换。现在,当特征值的数量变大时,ARPACK 变得很慢,但是可以使用另一种技巧/变换,计算的特征值,其中是确定哪一部分的“移位”频谱的探索(这是“移位”变换)。结合这两种变换,计算一定数量的逐个频带探索整个频谱详细信息在 [1],[2] 中。AσIdσ(AσId)1σ

[1] http://www.mcs.anl.gov/uploads/cels/papers/P1263.pdf

[2] http://alice.loria.fr/index.php/publications.html?redirect=0&Paper=ManifoldHarmonics@2008

[3] http://alice.loria.fr/software/graphite/doc/html/

另一种选择是使用 Jacobi 旋转。由于您的矩阵已经几乎是对角线,因此收敛应该不需要太多时间。通常它以线性速率收敛,但经过足够多的迭代后,收敛速率变为二次的。