Performance 找到一个特征向量
假设我有一个非常大的(对称的)矩阵M,大小为N×N,我只想提取一个对应于一个特征值的特征向量。有没有一种方法可以做到这一点,而不需要找到所有的特征向量。我想到的一种方法是首先找到特征值(这很快),然后求解一个特征向量Performance 找到一个特征向量,performance,numpy,scipy,eigenvalue,eigenvector,Performance,Numpy,Scipy,Eigenvalue,Eigenvector,假设我有一个非常大的(对称的)矩阵M,大小为N×N,我只想提取一个对应于一个特征值的特征向量。有没有一种方法可以做到这一点,而不需要找到所有的特征向量。我想到的一种方法是首先找到特征值(这很快),然后求解一个特征向量 E = np.linalg.eigvalsh(M) e = E[N/2] v = np.linalg.solve(E-np.diag([e]*N), 0) 当然你可以猜到,这个问题的解是v=0。我可以对M-eI进行SVD分解,但这似乎比只计算M的所有特征向量要慢。您可以使用 fr
E = np.linalg.eigvalsh(M)
e = E[N/2]
v = np.linalg.solve(E-np.diag([e]*N), 0)
当然你可以猜到,这个问题的解是v=0。我可以对M-eI进行SVD分解,但这似乎比只计算M的所有特征向量要慢。您可以使用
from scipy.sparse.linalg import eigs
看一下docstring-有一个参数
k
,用于设置要计算多少特征值和向量。如果我没记错的话,这是通过ARPACK中的迭代方案实现的。因此,请确保将tol
设置为适用于您的应用程序的适当值。IIRC,shift qr
是可以做到这一点的算法。sigma
参数可能特别有趣。请注意,这是稀疏linalg版本。我不确定常规linalg模块中是否也实现了shift qr
算法。Sigma正是我要寻找的参数。谢谢@cel!谢谢你的回复。我认为这回答了如何从光谱的顶部(底部?)找到特征向量的问题。我感兴趣的是如何找到对应于任何特征值的特征向量。啊,是的,很好,我误解了。这方面的典型算法是逆幂法。不要天真地应用,因为你的矩阵很大。但谷歌搜索一点就可以看出,你最初的帖子上的第一条评论可能是一种方式。我的问题措辞有点不准确,所以我的回答很糟糕。我感谢你的帮助。