我刚刚发现 numpy linalg.eig 算法的这种非常奇怪的行为。
如果运行
>>> import numpy as np
>>> a = np.array([[1., 0., 0., 0., 0., 0., 0., 0.],
... [0., -1., -0.5, 0., -0.5, 0., 0., 0.],
... [0., -0.5, 0., 0., 0., 0., 0., 0.],
... [0., 0., 0., 0., 0., 0., -0.5, 0.],
... [0., -0.5, 0., 0., 0., 0., 0., 0.],
... [0., 0., 0., 0., 0., 0., -0.5, 0.],
... [0., 0., 0., -0.5, 0., -0.5, -1., 0.],
... [0., 0., 0., 0., 0., 0., 0., 1.]])
>>> np.linalg.eig(a)
(array([-1.366, 0.366, -1.366, 0.366, 0. , 0. , 1. , 1. ]),
array([[ 0. , 0. , 0. , 0. , 0. , 0. , 1. , 0. ],
[-0. , 0. , -0.822, 0.426, 0. , 0. , 0. , 0. ],
[ 0. , 0. , -0.301, -0.581, 0.13 , 0. , 0. , 0. ],
[-0.325, -0.628, -0.123, -0.237, -0.695, -0.707, 0. , 0. ],
[ 0. , 0. , -0.301, -0.581, -0.13 , -0. , 0. , 0. ],
[-0.325, -0.628, -0.123, -0.237, 0.695, 0.707, 0. , 0. ],
[-0.888, 0.46 , -0.336, 0.174, -0. , -0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. , 0. , 0. , 1. ]]))
我得到了上面显示的错误特征向量(在列中)。
正确答案由
>>> np.linalg.eigh(a)
(array([-1.366, -1.366, -0. , 0. , 0.366, 0.366, 1. , 1. ]),
array([[-0. , 0. , 0. , 0. , 0. , -0. , 1. , 0. ],
[-0. , -0.888, 0. , 0. , 0. , -0.46 , 0. , 0. ],
[-0. , -0.325, 0. , -0.707, 0. , 0.628, 0. , 0. ],
[-0.325, 0. , -0.707, 0. , -0.628, -0. , 0. , 0. ],
[ 0. , -0.325, 0. , 0.707, 0. , 0.628, 0. , 0. ],
[-0.325, 0. , 0.707, 0. , -0.628, -0. , 0. , 0. ],
[-0.888, 0. , 0. , 0. , 0.46 , -0. , 0. , 0. ],
[-0. , 0. , 0. , 0. , 0. , -0. , 0. , 1. ]]))
我真的很惊讶 eig 算法不能对角化这样一个简单的矩阵!
我应该报告这种行为吗?
编辑
numpy 版本 1.6.2