Python 求矩阵和上特征值的Lanczos算法

Python 求矩阵和上特征值的Lanczos算法,python,numpy,scipy,linear-algebra,eigenvalue,Python,Numpy,Scipy,Linear Algebra,Eigenvalue,我试图找到numpy矩阵的顶部k前导特征值(使用python点积表示法) L@L+a*Y@Y.T,其中L和Y分别是对称nxn和nxd矩阵 根据下面的文章,我应该能够用L计算这些主要特征值@(L@v)+a*X@(X。T@v),我猜v是一个任意向量。他们引用的Lanczos论文是 我不太确定从哪里开始。我知道scipy有scipy.sparse.linalg.eigsh,从注释中可以看出它似乎使用了Lanczos算法——但我不知道是否可以在我的特定用例中使用sparse.linalg.eigsh。我

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

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

我不太确定从哪里开始。我知道scipy有
scipy.sparse.linalg.eigsh
,从注释中可以看出它似乎使用了Lanczos算法——但我不知道是否可以在我的特定用例中使用
sparse.linalg.eigsh
。我在谷歌上搜索了一下,没有很快找到一个Python实现——有人知道我是否可以用
sparse.linalg.eigsh
来计算它吗?我绝对不想自己写这个算法

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

您可以查看

将numpy作为np导入;
从scipy.sparse.linalg导入eigsh;
从numpy.linalg进口八
a=1.4
n=20;
d=7;
#随机对称nxn矩阵
L=np.random.randn(n,n)
L=L+L.T
#随机nxd矩阵
Y=np.random.randn(n,d)
A=L@L.T+A*Y@Y.T#你的方程
A必须是正定的才能使用
eigsh
,如果
A>0
,则保证为真

您可以检查四个特征值,如下所示

eigsh(La, 4)[0]
作为参考,你可以在比较的基础上计算所有的特征值。对它们进行排序,并获取排序数组的最后四个元素,结果应该是相近的

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

对,但我不想实际实例化Y@Y.T(或就此而言,L@L.T),因为它们可以变得巨大(想想数百万行/列)。我认为
scipy.sparse.LinearOperator
是一条可行之路。这还不清楚,因此您可以从Lanczos算法的标准实现开始,您只需执行标准算法,将
a@v
替换为
L@(L@T@v)+a*Y@(Y.T@v)
那么乘法最多只能产生
nx1
大小的矩阵中间结果。