繁体   English   中英

为什么numpy.linalg.eig不满足“矩阵点特征向量=特征值点特征向量”?

[英]Why does numpy.linalg.eig not satisfy "matrix dot eigen vector = eigen value dot eigen vector"?

谈话很便宜,这是代码。

#!/usr/bin/env python
# coding=utf-8
from numpy import linalg as nlin
from numpy import dot,array
def check_eig(matrix):
    eigen_values,eigen_vector_matrix=nlin.eig(test_matrix)
    print('list of eigen values:','\n',eigen_values)
    print('matrix of eigen vectors:','\n',eigen_vector_matrix)
    for i in range(len(eigen_values)):
        print('='*5)
        print('current eigen value:',eigen_values[i])
        print('current eigen vector:',eigen_vector_matrix[:,i])                
        print(dot(matrix,eigen_vector_matrix[:,i])==dot(eigen_values[i],eigen_vector_matrix[:,i]))
        print('-'*5)
    pass
if __name__=='__main__':
    test_matrix=array([[2,4,7,3],[3,4,1,9],[2,3,6,1],[5,5,10,11]])
    check_eig(test_matrix)
    pass

output 是:

list of eigen values: 
[19.53900138+0.j         -0.67342882+0.j          2.06721372+2.80827583j
2.06721372-2.80827583j]
matrix of eigen vectors: 
[[ 0.33504457+0.j         -0.94360845+0.j         -0.1790607 -0.21350827j
-0.1790607 +0.21350827j]
[ 0.51694078+0.j          0.23884601+0.j          0.79630803+0.j
0.79630803-0.j        ]
[ 0.21990713+0.j          0.14936312+0.j         -0.33955605-0.22141925j
-0.33955605+0.22141925j]
[ 0.75641141+0.j          0.17391471+0.j         -0.07359501+0.34424407j
-0.07359501-0.34424407j]]
=====
current eigen value: (19.53900137643081+0j)
current eigen vector: [0.33504457+0.j 0.51694078+0.j 0.21990713+0.j 0.75641141+0.j]
[False False False False]
-----
=====
current eigen value: (-0.6734288183538105+0j)
current eigen vector: [-0.94360845+0.j  0.23884601+0.j  0.14936312+0.j  0.17391471+0.j]
[False False False False]
-----
=====
current eigen value: (2.06721372096151+2.808275832055751j)
current eigen vector: [-0.1790607 -0.21350827j  0.79630803+0.j         -0.33955605-0.22141925j
-0.07359501+0.34424407j]
[False False False False]
-----
=====
current eigen value: (2.06721372096151-2.808275832055751j)
current eigen vector: [-0.1790607 +0.21350827j  0.79630803-0.j         -0.33955605+0.22141925j
-0.07359501-0.34424407j]
[False False False False]
-----

这很奇怪; 谁能告诉我为什么 numpy.linalg.eig 中的方法不满足基本方程“矩阵点特征向量 = 特征值点特征向量”?

舍入误差。

如果我们将==替换为-我们会看到差异都非常小,10⁻¹⁵ 和相似。

这通常适用于计算机上的浮点数学。 将它们与==精确比较会产生不可靠的结果,有时匹配,有时不匹配。

当我们需要比较浮点数时,我们需要减去它们,取绝对值并检查它是否小于某个容差(通常称为“epsilon”,尽管这也有一些不同的技术含义)。

如果我们这样写,测试就通过了:

abs(矩阵点特征向量 - 特征值点特征向量) < 10⁻¹⁴

print(abs(dot(matrix, eigen_vector_matrix[:,i]) - dot(eigen_values[i], eigen_vector_matrix[:,i])) < 1e-14)

当舍入误差仍然很小时,有一个完整的研究领域,“数值稳定性”。 例如,计算标准差的教科书公式就有这个问题——如果直接实现,舍入误差会变大——因此必须使用不同的公式在计算机上计算标准差。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM