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

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

固有値と固有ベクトル

固有値、固有ベクトルとは

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


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

が成り立つとき、\mathbf x\mathbf Aの固有ベクトル、\lambdaを固有値といいます。この式の意味するところは、\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です。

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

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

変換する点を固有ベクトルでない向きに変えると、式(1)は成り立ちませんので同一直線上にはならないことが確認できます。

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

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

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

# 固有値と固有ベクトル

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()