2012-08-14 12 views
4

특정 고유치에 해당하는 고유 벡터를 어떻게 찾을 수 있습니까?행렬의 특정 고유 값에 해당하는 고유 벡터를 찾는 방법은 무엇입니까?

나는 확률 행렬 (P), I는 고유치 1

고유치 및 고유 벡터의 배열을 반환 scipy.linalg.eig scipy 기능에 대응하는 고유 벡터를 찾을 필요가 1로되어있는 고유 값 중 하나를 갖는다.

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

+0

나는 당신이 eig가 아니고 eig가되었다고 생각합니다. scipy.sparse.linalg.eigs (P, k = 1, sigma = 1)로 시도했지만 예외가 발생했습니다. raise NotImplementedError ("shifted eigenproblem 아직 지원되지 않음") – AIB

+0

고정 eig -> eigs. Shifted 고유성 문제는 내가 사용하는 버전에서 구현됩니다. scipy 0.10.1 –

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)]있을 수 있으므로 2 차원 배열을 반환합니다. 배열의 각 행은 1.0의 고유 값을 갖는 고유 벡터입니다.

관련 문제