Numpy的特征向量不是真正的特征向量?

7
我正在进行一些矩阵运算,希望计算出特定矩阵的特征值和特征向量: enter image description here 我已经通过解析方法找到了它的特征值和特征向量,并想使用numpy.linalg.eigh来验证我的答案,因为这个矩阵是对称的。但问题在于:我找到了预期的特征值,但相应的特征向量似乎根本不是特征向量。
以下是我使用的代码片段:
import numpy as n
def createA():
#create the matrix A
    m=3
    T = n.diag(n.ones(m-1.),-1.) + n.diag(n.ones(m)*-4.) +\
    n.diag(n.ones(m-1.),1.)
    I = n.identity(m)
    A = n.zeros([m*m,m*m])
    for i in range(m):
        a, b, c = i*m, (i+1)*m, (i+2)*m
        A[a:b, a:b] = T
        if i < m - 1:
            A[b:c, a:b] = A[a:b, b:c] = I
    return A

A = createA()
ev,vecs = n.linalg.eigh(A)
print vecs[0]
print n.dot(A,vecs[0])/ev[0]

因此,对于第一个特征值/特征向量对,这将产生:

[  2.50000000e-01   5.00000000e-01  -5.42230975e-17  -4.66157689e-01
3.03192985e-01   2.56458619e-01  -7.84539156e-17  -5.00000000e-01
2.50000000e-01]

[ 0.14149052  0.21187998 -0.1107808  -0.35408209  0.20831606  0.06921674
0.14149052 -0.37390646  0.18211242]

在我对特征值问题的理解中,似乎这个向量不足以满足方程A.vec = ev.vec,因此这个向量根本不是特征值。

我非常确定矩阵A本身被正确实现,并且存在一个正确的特征向量。例如,我的解析推导的特征向量:

rvec = [0.25,-0.35355339,0.25,-0.35355339,0.5,-0.35355339,0.25,
-0.35355339,0.25]
b = n.dot(A,rvec)/ev[0]
print n.allclose(real,b)

输出结果为True

有没有人能够通过任何方式来解释这种奇怪的行为?我是否理解了特征值问题?可能是numpy出现了错误吗?

(因为这是我在这里的第一篇帖子,所以如果我的问题存在非常规问题,请谅解。感谢您的耐心。)

1个回答

8

特征向量按列向量的形式存储,如此处所述。因此,您需要使用vecs[:,0]而不是vecs[0]

例如,对我来说这个可以工作(我使用eig因为A不对称)

import numpy as np
import numpy.linalg as LA
import numpy.random

A = numpy.random.randint(10,size=(4,4))
# array([[4, 7, 7, 7],
#        [4, 1, 9, 1],
#        [7, 3, 7, 7],
#        [6, 4, 6, 5]])

eval,evec = LA.eig(A)

evec[:,0]
# array([ 0.55545073+0.j,  0.37209887+0.j,  0.56357432+0.j,  0.48518131+0.j])

np.dot(A,evec[:,0]) / eval[0]
# array([ 0.55545073+0.j,  0.37209887+0.j,  0.56357432+0.j,  0.48518131+0.j])

就是这样。-我感觉自己很傻- 非常感谢,那解决了一切! - JBouman
@JBouman 不要感到愚蠢,numpy/scipy的特征向量输出作为列而不是行是非常不规则且文档不完善的...我自己也遇到过这个问题并在互联网上探索了这个主题,这是一个非常常见的错误。 - Aaron Bramson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接