由numpy.linalg.eig创建的特征向量似乎不正确

时间:2015-10-03 19:54:33

标签: python numpy matrix eigenvector

我创建了一个任意的2x2矩阵:

select AGE,FNAME,LNAME,cast(datediff(DAY,DOB, '03-OCT-2015') /
(365.23076923074)  as int) as 'cal' from students1 (case when (AGE = AGE as 'cal')   THEN  '1'  ELSE  '0'  END)

我尝试使用numpy.linalg.eig:

计算特征向量
In [87]: mymat = np.matrix([[2,4],[5,3]])

In [88]: mymat
Out[88]: 
matrix([[2, 4],
        [5, 3]])

我将我的一个特征向量乘以我的矩阵,期望结果是一个向量,它是我的特征向量的标量倍。

In [91]: np.linalg.eig(mymat)
Out[91]: 
(array([-2.,  7.]),
 matrix([[-0.70710678, -0.62469505],
        [ 0.70710678, -0.78086881]]))

In [92]: eigvec = np.linalg.eig(mymat)[1][0].T

In [93]: eigvec
Out[93]: 
matrix([[-0.70710678],
        [-0.62469505]])

然而事实并非如此。任何人都可以向我解释这里出了什么问题吗?

2 个答案:

答案 0 :(得分:17)

来自linalg.eig的文档:

  

v :( ...,M,M)阵列
      标准化(单位“长度”)特征向量,使得       列v[:,i]是对应的特征向量       特征值w[i]

您想要的是列,而不是行。

>>> mymat = np.matrix([[2,4],[5,3]])
>>> vals, vecs = np.linalg.eig(mymat)
>>> vecs[:,0]
matrix([[-0.70710678],
        [ 0.70710678]])
>>> (mymat * vecs[:,0])/vecs[:,0]
matrix([[-2.],
        [-2.]])
>>> vecs[:,1]
matrix([[-0.62469505],
        [-0.78086881]])
>>> (mymat * vecs[:,1])/vecs[:,1]
matrix([[ 7.],
        [ 7.]])

答案 1 :(得分:-3)

不,这是真的。 numpy无法正常工作。例如:

A
Out[194]: 
matrix([[-3,  3,  2],
        [ 1, -1, -2],
        [-1, -3,  0]])

E = np.linalg.eig(A)

E
Out[196]: 
(array([ 2., -4., -2.]),
 matrix([[ -2.01889132e-16,   9.48683298e-01,   8.94427191e-01],
         [  5.54700196e-01,  -3.16227766e-01,  -3.71551690e-16],
         [ -8.32050294e-01,   2.73252305e-17,   4.47213595e-01]]))

A*E[1] / E[1]
Out[205]: 
matrix([[ 6.59900617, -4.        , -2.        ],
        [ 2.        , -4.        , -3.88449298],
        [ 2.        ,  8.125992  , -2.        ]])