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