微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决用于查找矩阵和的顶部特征值的 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:]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。