用于查找矩阵和的顶部特征值的 Lanczos 算法

计算科学 线性代数 Python 特征值 scipy 麻木的
2021-12-12 01:03:22

我试图找到kNumPy 矩阵的前导特征值(使用 python 点积表示法)L@L + a*X@X.T,其中分别是对称的矩阵,并且是标量。LXn×nn×da

根据本文下面的文字我应该能够用 计算这些主要特征值L@(L@v) + a*X@(X.T@v),我猜这里v是一个任意向量。他们引用的 Lanczos 论文在这里

我不太确定从哪里开始。我知道 scipy 在scipy.sparse.linalg.eigsh 这里,并且从注释看来它使用了 Lanczos 算法 - 但我不知道它是否可以sparse.linalg.eigsh用于我的特定用例。我四处搜索,并没有很快找到一个 Python 实现——有人知道我是否可以用sparse.linalg.eigsh某种方式计算这个吗?如果可以避免的话,我绝对不想自己写出这个算法。


在此处输入图像描述

1个回答

您可以定义一个线性运算符 并将其传递给函数eigsh理想情况下,您的矩阵是稀疏的,因此您可以利用矩阵向量积。LX

在您的情况下,您将拥有以下内容。

import numpy as np
from scipy.sparse.linalg import LinearOperator, eigsh

def mv(v):
    a = 2.3
    return L@(L@v) + a*X@(X.T@v)

n = L.shape[0]
k = 10
A = LinearOperator((n, n), matvec=mv)
eigenvalues, eigenvectors = eigsh(A, k=k, which="LM")
```