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

问题描述

我试图找到一个 numpy 矩阵的前 k 个前导特征值(使用 python 点积表示法)
L@L + a*Y@Y.T,其中 L 和 Y 分别是对称的 nxn 和 nxd 矩阵。

根据 this 论文中的以下文本,我应该能够使用 L@(L@v) + a*X@(X.T@v) 计算这些前导特征值,其中我猜 v一个任意向量。他们引用的 lanczos 论文是 here

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

我也不确定是在 math.stackexchange 中还是在这里发布此内容,因为这是一个关于 Python 实现的非常数学化的问题。

enter image description here

解决方法

您可以检查scipy.sparse.linalg.eigsh

import numpy as np;
from scipy.sparse.linalg import eigsh;
from numpy.linalg import eigh
a = 1.4
n = 20;
d = 7;
# random symmetric n x n matrix
L = np.random.randn(n,n)
L = L + L.T

# random n x d matrix
Y = np.random.randn(n,d)

A = L @ L.T + a * Y @ Y.T # your equation

A 必须是正定的才能使用 eigsh,如果 a>0,这保证为真。

您可以按如下方式检查四个特征值

eigsh(La,4)[0]

作为参考,您可以基于计算所有特征值的 numpy.linalg.eigh 进行比较。对它们进行排序,取已排序数组的最后四个元素,结果应该是接近的。

np.sort(eigh(La)[0])[-4:]