【線形代数、基礎数学】固有値、固有ベクトルをpythonで計算する

今回は固有値、固有ベクトルについて紹介します。
機械学習関連のことをしているとけっこう出てくると思うので復習しておきます。

固有値、固有ベクトル

ある正方行列\(A\)があるとします。

$$
\begin{aligned}
\textbf{A} \textbf{x} = \lambda \textbf{x}
\end{aligned}
$$

上の式を満たす実数\(\lambda\)を固有値
各固有値に対応するn次元列ベクトル\(\textbf{x}\)を固有ベクトルといいます。

名前の通りなんですが、 直感的には行列を表現する「固有」の値、ベクトルです。

固有値、固有ベクトルの求め方

固有値と固有値ベクトルの求め方はシンプルです。
まず、先程あげた式

$$
\begin{aligned}
A \textbf{x} = \lambda \textbf{x}
\end{aligned}
$$

から

$$
\begin{eqnarray}
A \textbf{x} – \lambda \textbf{x} = (A-\lambda E) \textbf{x} \tag{1}
\end{eqnarray}
$$

ここで、\(\textbf{x} \neq 0 \)より(参考文献1を参照)、

$$
\begin{eqnarray}
|A-\lambda E| = 0 \tag{2} \\
\end{eqnarray}
$$

式(2)を固有方程式と言います。
式(2)を解くと、固有値\(\lambda = \lambda_{0}, \lambda_{1}, \cdots \)を求めることができます。
求めた各固有値\(\lambda\)を式(1)に代入し固有ベクトル\(\textbf{x}\)を求めます。

具体例

具体例として、以下の二次正方行列\(A\)の固有値、固有ベクトルを求めてみようと思います。

$$
\begin{eqnarray}
A =
\begin{bmatrix}
4 & -2 \\
1 & 1
\end{bmatrix}
\end{eqnarray}
$$

固有値の計算

まず、この行列の固有値を求めます。
固有値を求めるときには固有方程式\(|A-\lambda E| = 0\)を解けば良いので、
最初に\(A-\lambda E\)を計算します。

$$
\begin{eqnarray}
A-\lambda E &=&
\begin{bmatrix}
4 & -2 \\
1 & 1 \
\end{bmatrix}

\begin{bmatrix}
\lambda & 0 \\
0 & \lambda \
\end{bmatrix} \\
&=&
\begin{bmatrix}
4-\lambda & -2 \\
1 & 1-\lambda \
\end{bmatrix}
\end{eqnarray}
$$

次に\(|A-\lambda E|\)を計算します。

$$
\begin{eqnarray}
|A-\lambda E| &=& (4-\lambda)(1-\lambda)+2 \\
&=& (4-\lambda)(1-\lambda)+2 \\
&=& \lambda ^2 -5\lambda + 6 \\
&=& (\lambda-3)(\lambda-2)
\end{eqnarray}
$$

よって 固有値\(\lambda\)は\(\lambda={3, 2}\)となります。

固有ベクトルの計算

次に各固有値に対応した固有ベクトルを求めてみます。

(i) \(\lambda = 3\)の時
\(\lambda = 3\)の時の固有ベクトルを\(\textbf{x}_1 = [\alpha _1, \alpha_2]^T\)とおきます。
そして、\((A – \lambda E) \textbf{x}_1 = 0\)を解きます。

$$
\begin{eqnarray}
A-\lambda E &=&
\begin{bmatrix}
1 & -2 \\
1 & -2
\end{bmatrix}
\begin{bmatrix}
\alpha _1 \\
\ \alpha _2
\end{bmatrix}
=
\begin{bmatrix}
0 \\
\ 0 \
\end{bmatrix} \\
\end{eqnarray}
$$

から

$$
\begin{eqnarray}
\alpha _1 – 2\alpha _2 &=& 0 \\
\alpha _1 &=& 2\alpha _2 \\
\end{eqnarray}
$$

ここで、\(\alpha_2=k_1\)とおくと、\(\alpha_1=2k_1\)なので、 固有ベクトル\(x_1\)は

$$
\begin{eqnarray}
x_1 =
\begin{bmatrix}
2 k_1 \\
k_1
\end{bmatrix} \\
\end{eqnarray}
$$

となります。

(ii) \(\lambda = 2\)の時も同様に計算すると

\(\lambda = 2\)の時、固有ベクトル\(x_2\)は

$$
\begin{eqnarray}
x_2 =
\begin{bmatrix}
k_2 \\
\ k_2
\end{bmatrix} \\
\end{eqnarray}
$$

よって、

$$
\begin{eqnarray}
\textbf{x} =
\begin{bmatrix}
x_1 & x_2
\end{bmatrix}
=
\begin{bmatrix}
2k_1 & k_2 \\
k_1 & k_2
\end{bmatrix}
\end{eqnarray}
$$

Pythonで固有値、固有ベクトルを計算してみる

Pythonで先程の行列\(A\)の固有値、固有ベクトルを求めてみます。

Numpyのlinalg.eigを用いることで簡単計算できます。 以下にサンプルコードを示します。

import numpy as np

A = np.array([[4., -2.], [1., 1.]])
w, v = np.linalg.eig(A) # 固有値、固有ベクトルの計算

print(w)  # 固有値の出力
#=> [3. 2.]
print(v)  # 固有ベクトルの出力
#=> [[0.89442719 0.70710678]
#    [0.4472136  0.70710678]]

手計算した時と同様の結果を得ることができました。

ちなみに、固有ベクトルの\(k_1=0.7071\)、\(k_2=0.447\)となっています。

参考文献

  1. スバラシク実力がつくと評判の線形代数キャンパス・ゼミ―大学の数学がこんなに分かる!単位なんて楽に取れる!スバラシク実力がつくと評判の線形代数キャンパス・ゼミ―大学の数学がこんなに分かる!単位なんて楽に取れる!

  2. https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.linalg.eig.html
  3. www.tcom242242.net

コメント

タイトルとURLをコピーしました