Numpy 特征向量不是特征向量?
Numpy eigenvectors aren't eigenvectors?
我正在做一些矩阵计算,想计算这个特定矩阵的特征值和特征向量:
我通过分析找到了它的特征值和特征向量,并想使用 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]
所以对于第一个 eigenvalue/eigenvector 对,这会产生:
[ 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 可能是错误的?
(因为这是我第一次 post 在这里:对于我的问题中的任何非常规之处,我深表歉意。提前感谢您的耐心等待。)
如here所述,特征向量存储为列向量。所以你必须使用 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])
我正在做一些矩阵计算,想计算这个特定矩阵的特征值和特征向量:
我通过分析找到了它的特征值和特征向量,并想使用 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]
所以对于第一个 eigenvalue/eigenvector 对,这会产生:
[ 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 可能是错误的?
(因为这是我第一次 post 在这里:对于我的问题中的任何非常规之处,我深表歉意。提前感谢您的耐心等待。)
如here所述,特征向量存储为列向量。所以你必须使用 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])