2014-02-18 40 views
3

如何計算python中的左側特徵向量?python中的左側特徵向量?

>>> import from numpy as np 
    >>> from scipy.linalg import eig 
    >>> np.set_printoptions(precision=4) 
    >>> T = np.mat("0.2 0.4 0.4;0.8 0.2 0.0;0.8 0.0 0.2") 
    >>> print "T\n", T 
    T 
    [[ 0.2 0.4 0.4] 
    [ 0.8 0.2 0. ] 
    [ 0.8 0. 0.2]] 
    >>> w, vl, vr = eig(T, left=True) 
    >>> vl 
    array([[ 0.8165, 0.8165, 0. ], 
      [ 0.4082, -0.4082, -0.7071], 
      [ 0.4082, -0.4082, 0.7071]]) 

這似乎不正確,谷歌並沒有對此善良!

回答

4

您的結果對我的理解是正確的。

但是,您可能會誤解它。 numpy docs對左側特徵向量應該更清楚一些。

最後,應強調的是,v由右側(如在 右手側)的一個特徵向量。對於某個數z,滿足點(yT,a)的矢量y稱爲左特徵向量,並且通常矩陣的左右特徵向量不一定是(可能是共軛的)轉置彼此的。

I.e.您需要將vl中的矢量轉置。 vl[:,i].T是第i個左特徵向量。 如果我測試這個,我得到,結果是正確的。

>>> import numpy as np 
>>> from scipy.linalg import eig 
>>> np.set_printoptions(precision=4) 
>>> T = np.mat("0.2 0.4 0.4;0.8 0.2 0.0;0.8 0.0 0.2") 
>>> print "T\n", T 
T 
[[ 0.2 0.4 0.4] 
[ 0.8 0.2 0. ] 
[ 0.8 0. 0.2]] 
>>> w, vl, vr = eig(T, left=True) 
>>> vl 
array([[ 0.8165, 0.8165, 0. ], 
     [ 0.4082, -0.4082, -0.7071], 
     [ 0.4082, -0.4082, 0.7071]]) 
>>> [ np.allclose(np.dot(vl[:,i].T, T), w[i]*vl[:,i].T) for i in range(3) ] 
[True, True, True] 
+0

謝謝Lemming,一個問題;我被告知通過>>> s = vl [:,1]/sum(v1 [:,1])來縮放我的lsh特徵向量,其中數組([7.3543e + 15,-3.6772e + 15, -3.6772e + 15])。我如何將科學記數法轉化爲可識別的東西,爲什麼我要對其進行縮放。謝謝! Chris –

+0

@ChrisRigano我其實不太確定,爲什麼你想要像這樣擴展特徵向量。因爲如果仔細觀察,你會發現總和幾乎爲零,因此這種縮放的結果不會很有意義。如果你打算做's = vl [:,1]/sqrt(sum(vl [:,1] ** 2))',那麼你會正常化你的特徵向量(即使它成爲長度爲1的向量)。請注意,'eig'給出的特徵向量已經被歸一化了。 – Lemming

+0

@ChrisRigano另請注意,'numpy'已經附帶'norm'函數'numpy.linalg.norm(v1 [:,1])'返回1.0。你也可以閱讀更多關於特徵向量的縮放[這裏](http://en.wikipedia.org/wiki/Eigenvalues_and_eigenvectors#Eigenspace_and_spectrum) – Lemming