问题描述
我试图找到一个 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 实现的非常数学化的问题。
解决方法
您可以检查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:]