2012-08-14 275 views
4

如何找出与特定特征值对应的特征向量?如何找出与矩阵的特定特征值对应的特征向量?

我有一个随机矩阵(P),特征值,其中为1。我需要找到对应于特征值1.

的SciPy的函数scipy.linalg.eig返回特征向量的阵列的特征向量中的一个。

D, V = scipy.linalg.eig(P) 

这里D(数组值)和V(矢量数组)都是矢量。

一种方法是在D中进行搜索并在V中提取相应的特征向量。是否有更简单的方法?

回答

4

如果您正在寻找一个对应于一个特征值的特征向量,使用scipy.sparse.linalg implementation of the eig function会更有效率。 它允许查找固定数量的特征向量并围绕特定值移动搜索。你可以这样做:

values, vectors = scipy.sparse.linalg.eigs(P, k=1, sigma=1) 
+0

它返回P的左特征值吗? – AIB 2012-08-14 15:47:07

+0

我认为你的意思是eig不是eig。我尝试了scipy.sparse.linalg.eigs(P,k = 1,sigma = 1),但是引发了一个异常 - raise NotImplementedError(“尚未支持移位特征问题”) – AIB 2012-08-14 15:52:31

+0

修复了eig - > eigs。移位的特征问题在我使用的版本中实现:scipy 0.10.1 – 2012-08-16 08:26:04

5
import numpy as np 
import numpy.linalg as linalg 


P = np.array([[2, 0, 0], [0, 1, 0], [0, 0, 3]]) 

D, V = linalg.eig(P) 
print(D) 
# [ 2. 1. 3.] 

的本征向量为V的列:

V = V.T 

for val, vec in zip(D, V): 
    assert np.allclose(np.dot(P, vec), val*vec) 

所以对应于特征值1.0的特征向量是

def near(a, b, rtol = 1e-5, atol = 1e-8): 
    return np.abs(a-b)<(atol+rtol*np.abs(b)) 

print(V[near(D, 1.0)]) 
# [[ 0. 1. 0.]] 

由于可以有多于一个的特征向量具有相同的特征值,V[near(D, 1.0)]返回一个二维数组 - 数组的每一行都是特征值为1.0的特征向量。

相关问题