Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 找到一个特征向量_Performance_Numpy_Scipy_Eigenvalue_Eigenvector - Fatal编程技术网

Performance 找到一个特征向量

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

假设我有一个非常大的(对称的)矩阵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的所有特征向量要慢。

您可以使用

from scipy.sparse.linalg import eigs

看一下docstring-有一个参数
k
,用于设置要计算多少特征值和向量。如果我没记错的话,这是通过ARPACK中的迭代方案实现的。因此,请确保将
tol
设置为适用于您的应用程序的适当值。

IIRC,
shift qr
是可以做到这一点的算法。
sigma
参数可能特别有趣。请注意,这是稀疏linalg版本。我不确定常规linalg模块中是否也实现了
shift qr
算法。Sigma正是我要寻找的参数。谢谢@cel!谢谢你的回复。我认为这回答了如何从光谱的顶部(底部?)找到特征向量的问题。我感兴趣的是如何找到对应于任何特征值的特征向量。啊,是的,很好,我误解了。这方面的典型算法是逆幂法。不要天真地应用,因为你的矩阵很大。但谷歌搜索一点就可以看出,你最初的帖子上的第一条评论可能是一种方式。我的问题措辞有点不准确,所以我的回答很糟糕。我感谢你的帮助。