任意の2x2行列を作成します。
In [87]: mymat = np.matrix([[2,4],[5,3]])
In [88]: mymat
Out[88]:
matrix([[2, 4],
[5, 3]])
Numpy.linalg.eigを使用して固有ベクトルを計算しようとしています。
In [91]: np.linalg.eig(mymat)
Out[91]:
(array([-2., 7.]),
matrix([[-0.70710678, -0.62469505],
[ 0.70710678, -0.78086881]]))
In [92]: eigvec = np.linalg.eig(mymat)[1][0].T
In [93]: eigvec
Out[93]:
matrix([[-0.70710678],
[-0.62469505]])
固有ベクトルの1つに行列を掛けて、結果が固有ベクトルのスカラー倍であるベクトルになることを期待します。
In [94]: mymat * eigvec
Out[94]:
matrix([[-3.91299375],
[-5.40961905]])
しかしそうではありません。ここで何が悪いのか誰かが私に説明できますか?
linalg.eig
のドキュメントから:
v:(...、M、M)配列
列v[:,i]
が固有値w[i]
に対応する固有ベクトルであるような正規化された(単位「長さ」)固有ベクトル。
行ではなく列が必要です。
>>> mymat = np.matrix([[2,4],[5,3]])
>>> vals, vecs = np.linalg.eig(mymat)
>>> vecs[:,0]
matrix([[-0.70710678],
[ 0.70710678]])
>>> (mymat * vecs[:,0])/vecs[:,0]
matrix([[-2.],
[-2.]])
>>> vecs[:,1]
matrix([[-0.62469505],
[-0.78086881]])
>>> (mymat * vecs[:,1])/vecs[:,1]
matrix([[ 7.],
[ 7.]])