機械学習に詳しくなりたいブログ

機械学習や数学について勉強した内容を中心に書きます。100%趣味です。記事は数学的に厳密でなかったり誤りを含んでいるかもしれません。ご指摘頂ければ幸いです。

固有値と固有ベクトル(アニメーション付き)

0でないベクトル\mathbf xに対して


\mathbf A \mathbf x = \lambda \mathbf x \tag{1}

が成り立つとき、\mathbf x\mathbf Aの固有ベクトル、\lambdaを固有値といいます。


\mathbf y = \mathbf A \mathbf x  \tag{2}

により\mathbf x\mathbf yに線形変換するとき、固有ベクトルと固有値はその変換の特徴を表しています。線形変換によって通常は向きや大きさが変化しますが、ある特定の方向のベクトルは、向きが変わらず大きさのみが変化します。その向きを固有ベクトル、大きさの変化量(定数倍量)を固有値といいます。したがって、特殊な場合として、単位行列\mathbf I の固有値は1であり、全てのベクトルが固有ベクトルになります。

さて、例として


  \mathbf A  = \left(
    \begin{array}{cc}
      1 & 4  \\
      2 & 3 \\
    \end{array}
  \right) \tag{3}

のとき、式(2)によって線形変換される様子を図に示します。なおこの行列式の固有ベクトルは、\displaystyle \left( -\frac{2}{\sqrt 5},\frac{1}{\sqrt 5} \right)^{T}\displaystyle \left(-\frac{1}{\sqrt 2},-\frac{1}{\sqrt 2}\right)^{T}、対応する固有値はそれぞれ-1,5です。 f:id:opabinia2:20180603214319p:plain

格子状に並んだ青色の点が、赤色の点に変換されます。図中の矢印はそれぞれ固有ベクトルを表しています。図中の固有ベクトルは、固有値の比になるように描いていますが、長さは適当です。

固有ベクトルの性質を見るため、元の点を固有ベクトルの方向のみとした場合にどうなるか試してみました。以下のように同一直線上に変換されていることが確認できます。また、固有値が5ですから、5倍の大きさになっていることもわかります。(図からは読み取りづらいですが、、、) f:id:opabinia2:20180604211813p:plain

方向を変えてみると、同一直線上にはならないことが確認できます。 f:id:opabinia2:20180604211820p:plain

一連の動きをアニメーションにしてみました。固有値が1の方向では、向き、大きさ共に変化していないことなど見て取れます。 f:id:opabinia2:20180604220849g:plain

今回の図を描いたコードです。

関連:固有ベクトルと基底

# 固有値と固有ベクトル

import matplotlib.pyplot as plt
import numpy as np

#
N = 20

# 変換行列
A = np.array([[1, 4], [2, 3]])

X1, X2 = np.meshgrid(np.linspace(-1, 1, N), np.linspace(-1, 1, N))

# 固有値、固有ベクトル
lam, v = np.linalg.eig(A)

Y = np.dot(A, np.vstack([X1.reshape(1, N*N), X2.reshape(1, N*N)]))

plt.xlim(-5, 5)
plt.ylim(-5, 5)
plt.scatter(X1, X2, color="blue", s=1)
plt.scatter(Y[0, :], Y[1, :], color="red", s=1)

plt.quiver(0, 0, v[0,0], v[1,0], angles="xy", units="xy", color="black", scale=1/np.abs(lam[0]))
plt.quiver(0, 0, v[0,1], v[1,1], angles="xy", units="xy", color="black", scale=1/np.abs(lam[1]))

plt.show()