Python入門トップページ


目次

  1. NumPy とは
  2. Python リストの場合
  3. NumPy の使用例
  4. NumPy で線形代数
    1. 行列式
    2. 単位行列
    3. 逆行列
    4. 行列の階数
    5. 固有値
    6. 固有値の応用例:PageRank
    7. ノルム(L1ノルムとL2ノルム)
  5. NumPy の乱数生成

NumPy

NumPy で線形代数

固有値

\begin{eqnarray} \left( \begin{array}{rr} 5 & 4 \\ 3 & 1 \end{array} \right) \left( \begin{array}{r} 2 \\ 2 \end{array} \right) = \left( \begin{array}{r} 18 \\ 8 \end{array} \right) \end{eqnarray}

上の式はベクトル \(\left(\begin{array}{r}2\\2\end{array}\right)\) が行列 \(\left(\begin{array}{rr}5&4\\3&1\end{array}\right)\) によって \(\left(\begin{array}{r}18\\8\end{array}\right)\) というベクトルに一次変換されたことを意味する.つまり,行列はある向きと大きさを持つベクトルを別のベクトルに変換することができる.

install_01

いま行列 \(A\) について向きを変えないような特別なベクトルがあるかどうか,またその大きさは何倍になるかを考える.例えば,行列 \(\left(\begin{array}{rr}5&4\\3&1\end{array}\right)\) をベクトル \(\left(\begin{array}{r}2\\1\end{array}\right)\) に作用させると,

\begin{eqnarray} \left( \begin{array}{rr} 5 & 4 \\ 3 & 1 \end{array} \right) \left( \begin{array}{r} 2 \\ 1 \end{array} \right) = \left( \begin{array}{r} 14 \\ 7 \end{array} \right)= 7 \left( \begin{array}{r} 2 \\ 1 \end{array} \right) \end{eqnarray}

となる.これは \(\left(\begin{array}{r}2\\1\end{array}\right)\) というベクトルの方向を変えずに大きさだけを7倍していることを意味する.

install_01

また

\begin{eqnarray} \left( \begin{array}{rr} 5 & 4 \\ 3 & 1 \end{array} \right) \left( \begin{array}{r} -2 \\ 3 \end{array} \right) = \left( \begin{array}{r} 2 \\ -3 \end{array} \right)= -1 \left( \begin{array}{r} -2 \\ 3 \end{array} \right) \end{eqnarray}

も \(\left(\begin{array}{r}-2\\3\end{array}\right)\) というベクトルの方向を変えずに大きさだけを -1 倍していることを意味する.ここで,7 と -1 が行列 \(\left(\begin{array}{rr}5&4\\3&1\end{array}\right)\) に対する固有値であり,ベクトル \(\left(\begin{array}{r}2\\1\end{array}\right)\) は固有値 7 に対する固有ベクトル,ベクトル \(\left(\begin{array}{r}-2\\3\end{array}\right)\) は固有値 -1 に対する固有ベクトルである.

固有値,固有ベクトルの定義は次のようになる.

ある \(n\) 次正方行列 \(A\) に対し

\begin{eqnarray} A \boldsymbol{x} = \lambda \boldsymbol{x} \end{eqnarray}

を満たす \(n\) 次元列ベクトル \(\boldsymbol{x}\) \((\boldsymbol{x} \neq 0)\) が存在するとき \(\lambda\) を \(A\) の固有値といい,\(\boldsymbol{x}\) を \(\lambda\) に対する固有ベクトルという.

Python の NumPy で行列の固有値 (eigenvalue),固有ベクトル (eigenvector) を求めるには,np.linalg.eig() を用いると良い.上の行列 \(\left(\begin{array}{rr}5&4\\3&1\end{array}\right)\) について固有値と固有ベクトルを求めてみよう.

まず,行列を定義する.

行列の定義import numpy as np # プログラムの先頭でモジュールを読み込む
A = np.array([[5, 4], [3, 1]])
print(A)
[[5 4]
 [3 1]]

固有値 (w) と固有ベクトル (v) を np.linalg.eig() によって求める.

固有値と固有ベクトルの計算w, v = np.linalg.eig(A)

固有値を表示してみる.

固有値の表示print("固有値")
print(w)
固有値
[ 7. -1.]

固有ベクトルを表示してみる.

固有ベクトルの表示print("固有ベクトル")
print(v)
固有ベクトル
[[ 0.89442719 -0.5547002 ]
 [ 0.4472136   0.83205029]]

つまり,固有値 7 に対する固有ベクトルが [0.89442719, 0.4472136]であり,固有値 -1 に対する固有ベクトルが [-0.5547002, 0.83205029] である.なお,固有ベクトルは任意の定数を含んでいるので,線形代数の教科書に登場するような固有ベクトルが整数化できるよう調整された問題であれば整数化しても良い.それぞれの固有値に対する固有ベクトルを上で求めたように変換することもできる.

固有値 7 の固有ベクトルprint("固有値", w[0], "に対する固有ベクトル")
print(v[:,0]/v[1,0])
固有値 7.0 に対する固有ベクトル
[2. 1.]
固有値 -1 の固有ベクトルprint("固有値", w[1], "に対する固有ベクトル")
print(v[:,1]/v[1,1]*3)
固有値 -1.0 に対する固有ベクトル
[-2.  3.]

これらの固有ベクトルはここで例示したものと一致した.

目次に戻る