web-dev-qa-db-ja.com

numpy.linalg.eigによって作成された固有ベクトルが正しくないようです

任意の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]])

しかしそうではありません。ここで何が悪いのか誰かが私に説明できますか?

9
Selah

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.]])
19
DSM