パープルハット

※当サイトではGoogleアドセンス広告を利用しています

Numpy 固有値・固有ベクトル計算



まずは手計算で求める

今回は行列


A=
\begin{pmatrix}
2 & 1 \\  
0 & -1
\end{pmatrix}
について固有値・固有ベクトルの計算をします。

行列の固有値を\lambdaとすると、


 |\lambda I - A| = 0

 (\lambda -2)(\lambda + 1) = 0

 \lambda = 2, -1

と求まります。
ここで、
固有ベクトル v (\lambda I - A)v = 0を満たすので、正規化(長さを1に調整)すると

  •  \lambda_1 = 2のときは  v_1 = \begin{pmatrix} 1 \\ 0 \end{pmatrix}
  •  \lambda_2 = -1のときは  v_2 = \begin{pmatrix} -1/3 \\ 2/3 \end{pmatrix}

と求まる。




Numpyを利用して求める

value, vector = np.linalg.eig(A)

とすることで行列Aの固有値がvalueに、固有ベクトルがvectorに格納される。

実際に先ほどの行列Aを計算するために以下のプログラムを動かしてみる

import numpy as np

#行列の定義
A = np.array([[2, 1], [0, -1]])

#固有値と固有ベクトルを計算
value, vect = np.linalg.eig(A)

#表示
print(f'value = {value}')
print(f'vect\n{vect}')


すると、実行結果は次のようになり

  •  value = (\lambda_1, \lambda_2)
  •  vec = (v_1, v_2)

となることが分かる。

実行結果

value = [ 2. -1.]
vect
[[ 1.         -0.31622777]
 [ 0.          0.9486833 ]]





おまけ(固有値最大の固有値ベクトルを求める)

ページランクなどで固有値最大の固有ベクトルを計算する場合などは次のようにすればよいです。

import numpy as np

#行列の定義
A = np.array([[2, 1], [0, -1]])

#固有値と固有ベクトルを計算
value, vect = np.linalg.eig(A)

#固有値最大の固有値ベクトルを表示
print(vect[:,value.argmax()])

実行結果

[1. 0.]