在python中左手边的特征向量?

时间:2014-02-18 22:33:17

标签: python-2.7 numpy eigenvector

如何计算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]])

这似乎不正确,谷歌对此并不善良!

1 个答案:

答案 0 :(得分:4)

你的结果对我的理解是正确的。

但是,你可能会误解它。 numpy docs对于左特征向量应该更清楚一些。

  

最后,强调v由右边组成(如   右侧)a的特征向量。满足点的矢量y(y.T,a)   = z * y.T对于某些数字z称为a的左本征向量,并且通常,矩阵的左右特征向量不是   必然是彼此的(可能是共轭的)转置。

即。你需要在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]