2017-05-14 27 views
0

매우 큰 행렬을 가지고 있지만 특정 고유 값을 가진 고유 벡터 (1 이상)를 찾고 싶습니다. 파이썬에서이 행렬의 전체 고유 값과 고유 벡터를 풀지 않고 어떻게 이것을 얻을 수 있습니까?파이썬에서 특정 고유치를 갖는 고유 상태

+0

내가 ... 희소 행렬로는 스파 스 매트릭스를 사용할 필요는 없습니다 – JoeJackJessieJames

+0

을 내 np.mat (A) 매트릭스를 변환하는 방법을 모른다, 나는 ... – ewcz

답변

0

아마도 하나의 옵션은 shift-invert 메소드를 사용하는 것일 수 있습니다.

import numpy as np 
from scipy.sparse.linalg import eigs 

np.random.seed(42) 

N = 10 
A = np.random.random_sample((N, N)) 
A += A.T 
A += N*np.identity(N) 

#get N//2 largest eigenvalues 
l,_ = eigs(A, N//2) 
print(l) 

#get 2 eigenvalues closest in magnitude to 12 
l,_ = eigs(A, 2, sigma = 12) 
print(l) 

이 생성 :

[ 19.52479260+0.j 12.28842653+0.j 11.43948696+0.j 10.89132148+0.j 
    10.79397596+0.j] 
[ 12.28842653+0.j 11.43948696+0.j] 

EDIT : 경우 scipy에있어서 eigssigma 그것을 고유 검색해야 할 가까운 값을 지정하는 것이 가능하다하여 선택적 파라미터를 갖는다 당신은 고유 값을 미리 알고 있습니다. 그러면 대응하는 의 기초를 계산할 수 있습니다. 예를 들어 :

import numpy as np 
from numpy.linalg import eig, svd, norm 
from scipy.sparse.linalg import eigs 
from scipy.linalg import orth 

def nullspace(A, atol=1e-13, rtol=0): 
    A = np.atleast_2d(A) 
    u, s, vh = svd(A) 
    tol = max(atol, rtol * s[0]) 
    nnz = (s >= tol).sum() 
    ns = vh[nnz:].conj().T 
    return ns 

np.random.seed(42) 

eigen_values = [1,2,3,3,4,5] 
N = len(eigen_values) 

D = np.matrix(np.diag(eigen_values)) 

#generate random unitary matrix 
U = np.matrix(orth(np.random.random_sample((N, N)))) 

#construct test matrix - it has the same eigenvalues as D 
A = U.T * D * U 

#get eigenvectors corresponding to eigenvalue 3 
Omega = nullspace(A - np.eye(N)*3) 
_,M = Omega.shape 

for i in range(0, M): 
    v = Omega[:,i] 
    print(i, norm(A*v - 3*v)) 
+0

예를 게시 고유 값 2를 가진 모든 고유 벡터를 찾고 싶다면 어떻게 될까요? – JoeJackJessieJames

+0

또한 정상적인 행렬에 eig를 사용하면 오류 메시지가 표시됩니다. ValueError : 행렬 유형이 'f', 'd', 'F'또는 'D'이어야합니다. – JoeJackJessieJames

+0

상한선과 함께 'eigs' 고유 벡터의 수를 추정 한 다음 수동으로 결과를 필터링하거나 예를 들어 svd를 사용하여 직접'A - \ lambda '의 기초를 결정할 수 있습니다. 오류에 관해서는, 당신의 행렬의'type'은 무엇입니까? – ewcz