对于某些计算,我需要进行特征值分解。现在我试着评估numpy的功能,并注意到有一个非常糟糕的行为!看看这个:
import numpy as np
N = 3
A = np.matrix(np.random.random([N,N]))
A = 0.5*(A.H + A) #Hermetian part
la, V = np.linalg.eig(A)
VI = np.matrix(np.linalg.inv(V))
V = np.matrix(V)
/ edit:我现在选择了一个hermetian Matrix,所以这很正常。
数学说我们应该有VI * VH = 1,VH * A * V = VI * A * V = D,其中D是特征值的对角矩阵。我从随机矩阵得到的结果是:
print(A.H*A - A*A.H)
[[ 0. 0. 0.]
[ 0. 0. 0.]
[ 0. 0. 0.]]
这表明A是正常的。
print(V.H*A*V)
[[ 1.71513832e+00 5.55111512e-17 -1.11022302e-16]
[ -1.11022302e-16 -5.17694280e-01 0.00000000e+00]
[ -7.63278329e-17 -4.51028104e-17 1.28559996e-01]]
print(VI*A*V)
[[ 1.71513832e+00 -2.77555756e-16 -2.22044605e-16]
[ 7.49400542e-16 -5.17694280e-01 -4.16333634e-17]
[ -3.33066907e-16 1.70002901e-16 1.28559996e-01]]
这两个工作是正确的,因为非对角线非常小,在对角线上我们有特征值。
print(VI*V.H)
[[ 0.50868822 -0.57398479 0.64169912]
[ 0.16362266 0.79620605 0.58248052]
[-0.84525968 -0.19130446 0.49893755]]
这应该是一个,但它远离它。
所以大家,现在告诉我,在制作特征向量时出了什么问题,即使在这个小例子中?任何人都可以告诉我在使用这个功能时我必须关心什么,以及我可以对付这个伟大的错配?
答案 0 :(得分:6)
引自numpy.linalg.eig documentation:
同样,如果矩阵a是正常的,即,如果点(a,aH)=点(aH,a),则特征向量v的(复值)矩阵是单一的,其中aH表示a的共轭转置。
显然,在您拥有的示例A^H A != A A^H
中,矩阵V
不是单一的。
因此,V.T.conj()
与V
的倒数无关。
这种假设正确的最常见情况是厄米特矩阵。