【问题标题】:Incorrect EigenValues/Vectors with NumpyNumpy 的特征值/向量不正确
【发布时间】:2013-09-17 06:23:06
【问题描述】:

我正在尝试查找以下矩阵的特征值/向量:

A = np.array([[1, 0, 0],
              [0, 1, 0],
              [1, 1, 0]])

使用代码:

from numpy import linalg as LA
e_vals, e_vecs = LA.eig(A)

我得到了这个答案:

print(e_vals)
[ 0.  1.  1.]

print(e_vecs)
[[ 0.          0.70710678  0.        ]
 [ 0.          0.          0.70710678]
 [ 1.          0.70710678  0.70710678]]

但是,我相信以下应该是答案。

[1] Real Eigenvalue = 0.00000
[1] Real Eigenvector:
0.00000
0.00000
1.00000

[2] Real Eigenvalue = 1.00000
[2] Real Eigenvector:
1.00000
0.00000
1.00000

[3] Real Eigenvalue = 1.00000
[3] Real Eigenvector:
0.00000
1.00000
1.00000

也就是说,特征值-特征向量问题说以下应该成立:

# A * e_vecs = e_vals * e_vecs
print(A.dot(e_vecs))
[[ 0.          0.70710678  0.        ]
 [ 0.          0.          0.70710678]
 [ 0.          0.70710678  0.70710678]]

print(e_vals.dot(e_vecs))
[ 1.          0.70710678  1.41421356]

【问题讨论】:

    标签: python matrix scipy eigenvalue eigenvector


    【解决方案1】:

    linalg.eig 返回的特征值是列向量,因此您需要遍历e_vecs转置(因为迭代二维数组默认返回行向量):

    import numpy as np
    import numpy.linalg as LA
    A = np.array([[1, 0, 0], [0, 1, 0], [1, 1, 0]])
    e_vals, e_vecs = LA.eig(A)
    
    print(e_vals)
    # [ 0.  1.  1.]
    print(e_vecs)
    # [[ 0.          0.          1.        ]
    #  [ 0.70710678  0.          0.70710678]
    #  [ 0.          0.70710678  0.70710678]]
    
    for val, vec in zip(e_vals, e_vecs.T):
        assert np.allclose(np.dot(A, vec), val * vec)
    

    【讨论】:

    • 您好,unutbu,但是还没有问题吗?如果你将 A 乘以第一个向量结果 [0, 0.70710678, 0] 你会得到 [0, 0.70710678, 0.70710678] 不能缩回特征向量?
    • 转置e_vecs后,特征向量是e_vecs。我转置了e_vecs,以便更轻松地使用zip(e_vals, e_vecs) 迭代特征向量。
    • 啊,明白了。谢谢!
    • +1 用于转置特征向量,我已经为此奋斗了几个小时,但结果仍然很奇怪......
    • 谢谢!转置是关键。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    相关资源
    最近更新 更多