Skip to main content
 首页 » 编程设计

python之Numpy 中的特征向量 : Very bad numerics 我做错了什么吗

2025年05月04日17lvdongjie

对于某些计算,我需要进行特征值分解。现在我尝试评估 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]] 

这应该是一个,但离它很远。

所以,现在告诉我,即使在这个小例子中,在制作特征向量的过程中出了什么问题?谁能告诉我在使用这个功能时我什么时候需要注意,以及我能做些什么来防止这种严重的不匹配?

请您参考如下方法:

引自 numpy.linalg.eig documentation :

Likewise, the (complex-valued) matrix of eigenvectors v is unitary if the matrix a is normal, i.e., if dot(a, a.H) = dot(a.H, a), where a.H denotes the conjugate transpose of a.

显然,在您的示例中,A^H A != A A^H,因此矩阵 V 不是酉矩阵。 因此,V.T.conj() 与 V 的逆函数无关。 此假设正确的最常见情况是厄密矩阵。