のんびり亀エンジニアの勉強日記

勉強したこと調べたことをゆるくまとめていきます。

固有値分解の定義とPython実装

固有値分解

固有値固有ベクトル

ある正方行列 {\bf A} と零ベクトルではないベクトル {\bf x}スカラー {\lambda}が下記の条件を満たすとき、 {\bf x} {\bf A} 固有ベクトル {\lambda} {\bf A} 固有値といいます。

 \displaystyle
{\bf A}{\bf x} = \lambda{\bf x}
固有値の求め方

定義を少し変形させてみます。(ただし、 {\bf I}単位行列とする)

 \displaystyle
\begin{align}
{\bf A}{\bf x} &= \lambda{\bf x} \\
{\bf A}{\bf x} &= \lambda{\bf I}{\bf x} \\
({\bf A}-\lambda{\bf I}){\bf x} &= {\bf 0}
\end{align}

 {\bf x}は零ベクトルではないので、 {\bf A}-\lambda{\bf I}が非正則(逆行列を持たない)である必要があります。 つまり、行列 {\bf A}-\lambda{\bf I}行列式を0にする \lambdaを計算すれば固有値を求めることができます。

例題

   {\bf A} = \begin{bmatrix}5 & -2 \\9 & -6 \end{bmatrix}固有値 \lambda固有ベクトル {\bf x}を求める。

 \displaystyle
\begin{align}
{\bf A}-\lambda{\bf I} &= \begin{bmatrix}5-\lambda & -2 \\9 & -6-\lambda \end{bmatrix}
\end{align}

  よって

 \displaystyle
\begin{align}
\det({\bf A}-\lambda{\bf I}) &= 0 \\
(5-\lambda)(-6-\lambda)- (-2) \times9 &= 0 \\
\lambda^2 + \lambda - 12 &= 0 \\
(\lambda+4)(\lambda-3) = 0 \\
\lambda = -4, 3
\end{align}

   \lambda=-4のとき、

 \displaystyle
\begin{align}
\begin{bmatrix}9 & -2 \\9 & -2 \end{bmatrix} {\bf x} = {\bf 0} \\
{\bf x} = \begin{bmatrix}2 \\9 \end{bmatrix}
\end{align}

   \lambda=3のとき、

 \displaystyle
\begin{align}
\begin{bmatrix}2 & -2 \\9 & -9 \end{bmatrix} {\bf x} = {\bf 0} \\
{\bf x} = \begin{bmatrix}1 \\1 \end{bmatrix}
\end{align}

固有値分解

正方行列 {\bf A} 固有ベクトル {\bf x}_1, {\bf x}_2, \cdots , {\bf x}_n固有値 \lambda_1, \lambda_2, \cdots , \lambda_nのとき

 \displaystyle
\begin{align}
{\bf A}\begin{bmatrix} {\bf x}_1 & {\bf x}_2 & \cdots & {\bf x}_n \end{bmatrix} &= \begin{bmatrix} \lambda_1{\bf x}_1 & \lambda_2{\bf x}_2 & \cdots & \lambda_n{\bf x}_n \end{bmatrix}  \\
&= \begin{bmatrix} {\bf x}_1 & {\bf x}_2 & \cdots & {\bf x}_n \end{bmatrix} 
       \begin{bmatrix} 
       \lambda_1 & 0 & \cdots & 0\\
       0 & \lambda_2 & \cdots & 0\\
       \vdots & \vdots &  & \vdots\\
       0 & 0 & \cdots & \lambda_n\\
       \end{bmatrix} 
\end{align}

が成り立つ。

 \displaystyle
\begin{align}
{\bf P} =  \begin{bmatrix} {\bf x}_1 & {\bf x}_2 & \cdots & {\bf x}_n \end{bmatrix} , 
\Lambda =  \begin{bmatrix} 
       \lambda_1 & 0 & \cdots & 0\\
       0 & \lambda_2 & \cdots & 0\\
       \vdots & \vdots &  & \vdots\\
       0 & 0 & \cdots & \lambda_n\\
       \end{bmatrix} 
\end{align}

とすると、

 \displaystyle
\begin{align}
{\bf A} = {\bf P}\Lambda{\bf P}^{-1}
\end{align}

となる。
このように正方行列 {\bf A}固有値固有ベクトルの行列に分解することを固有値分解といいます。

Pythonでの実装

Python固有値固有ベクトルを求めたいときはnp.linalg.eigを使えば簡単に計算できます。

import numpy as np

A = np.array([[5, -2], [9, -6]])
eigen_val, eigen_vec = np.linalg.eig(A)

print("行列Aの固有値")
print(eigen_val)
print("")

print("行列Aの固有ベクトル")
print(eigen_vec)
print("")

print("PΛP^-1の計算結果")
P = eigen_vec
Lambda = np.diag(eigen_val)
print(np.dot(np.dot(P, Lambda), np.linalg.inv(P)))

実行結果はこちらのとおり

行列Aの固有値
[ 3. -4.]

行列Aの固有ベクトル
[[0.70710678 0.21693046]
 [0.70710678 0.97618706]]

PΛP^-1の計算結果
[[ 5. -2.]
 [ 9. -6.]]

ちゃんと手計算で求めた結果と同じになってます。