2017-05-14 216 views
0

我有一個非常大的矩陣,但我只想找到具有一個特定特徵值的特徵向量(大於1)。如何在不解決python中這個矩陣的整個特徵值和特徵向量的情況下得到這個結果?本徵態在python中具有特定的特徵值

+0

,我不知道如何我np.mat(A)矩陣轉換爲稀疏矩陣... – JoeJackJessieJames

+0

它沒有必要用一個稀疏矩陣,我已經發布了一個例子... – ewcz

回答

0

一個選項可能可能是使用shift-invert方法。在SciPy的方法eigs具有sigma使用其中能夠接近指定值,該要搜索的特徵值的可選參數:

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] 

編輯: 萬一你事先知道特徵值,那麼你可以嘗試計算相應的基礎。例如:

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

此外,如果我用我的正常矩陣eigs,錯誤消息說:ValueError:矩陣類型必須是'f','d','F'或'D' – JoeJackJessieJames

+0

您可以使用具有上限的eigs估計特徵向量的數量,然後手動過濾結果,或者例如直接使用svd確定「A - \ lambda」的基礎。至於錯誤,矩陣的「類型」是什麼? – ewcz