数学の小径 - 固有値と対角化の話

ちょっと新たな試みで、数学の小ネタの雑談コーナーをはじめるよ!

急にどうした!?

この前、とらじろーさんのブログ を読んで触発されたので……。

僕も数学の楽しさを再発見できたらなーと思ったのでした。

なるほど。

そんなわけで今日は、行列の固有値・対角化について、まったり話そうと思うよー。

行列 {\boldsymbol{A}} に対して、

{\boldsymbol{A}\boldsymbol{u}=\lambda\boldsymbol{u}}

となる定数 {\lambda} {\boldsymbol{0}} でないベクトル  {\boldsymbol{u}} が存在するとき、{\lambda} {\boldsymbol{A}}固有値{\boldsymbol{u}} をそれに対する固有ベクトルと呼ぶ。

定義

行列 {\boldsymbol{A}} は、ベクトルの向きと大きさをどちらも変えるチカラを持っているけど、スカラー {\lambda} はベクトルの大きさを変えるチカラしか無いんだよね。

うん。

なので、固有ベクトルは、行列 {\boldsymbol{A}}チカラをもってしてもなお向きが変わらない特別なベクトルということになるね。

なるほどなるほど。

次の行列の固有値固有ベクトルを求めよ。

{\begin{bmatrix}
6 & 2 \\
2 & 3
\end{bmatrix}}

例題

めんどくさいのでPythonに解いてもらおう。

import numpy as np
from scipy import linalg as sla

A = np.array([[6, 2],
              [2, 3]])

result = sla.eig(A)

eigvalue = result[0]
eigvector = result[1]

print(eigvalue)
# 出力: [7.+0.j 2.+0.j]

print(eigvector)
# 出力: [[ 0.89442719 -0.4472136 ]
#       [ 0.4472136   0.89442719]]

これは、どう見ればいいの?

まず固有値が2つ({\lambda_{1}=7,\,\lambda_{2}=2})、そして対応する固有ベクトル {\boldsymbol{u}_{1} = \left[ 0.89442719,\, -0.4472136\right]^{t},} {\boldsymbol{u}_{2} = \left[ 0.4472136,\,0.89442719 \right]^{t}} が、それぞれ見つかったということだよ。

いきなり答えが出てきちゃったけど、これって合ってるの?

本当に答えが合っているかどうか検算してみようか。

求めた固有値固有ベクトルを、先程の定義式 {\boldsymbol{A}\boldsymbol{u}=\lambda\boldsymbol{u}} に代入して、値が一致するかどうか見てみよう。

import numpy as np
from scipy import linalg as sla

A = np.array([[6, 2],
              [2, 3]])

result = sla.eig(A)
eigvalue = result[0]
eigvector = result[1]

# 検算

# 1つ目の固有値と固有ベクトル
lambda1 = eigvalue[0]
u1 = eigvector[:, 0]

print(A @ u1)       # 𝑨𝒖₁
# 出力: [6.26099034     3.13049517]

print(lambda1 * u1) # λ₁𝒖₁
# 出力: [6.26099034+0.j 3.13049517+0.j]


# 2つ目の固有値と固有ベクトル
lambda2 = eigvalue[1]
u2 = eigvector[:, 1]

print(A @ u2)       # 𝑨𝒖₂
# 出力: [-0.89442719      1.78885438]

print(lambda2 * u2) # λ₂𝒖₂
# 出力: [-0.89442719+0.j  1.78885438+0.j]

おー、なんか合ってそうだね。

そうだね。


対称行列

ここからは雑談なのだけど、実際に固有値問題を解く必要が生じるのは、だいたい対称行列の場合だけだよ。

なぜに。

ちょっと誤解があったかも知れないので補足すると、あくまで、線型代数を道具として使う場合においての話だよ。

定期試験や院試では普通に対称行列以外についても固有値問題が出題されるよ。

ふむ。

なのでここから先は、特に断りがない限り、対称行列のみを扱うものとして話をするよ。

そうすると、何がうれしいの?

証明は略すけど、まず固有値が必ず実数になる。

そして、単位固有ベクトルは互いに直交する性質があるのだ。

{n\times n} 対称行列 {\boldsymbol{A}}固有値  {\lambda_{1},\,\cdots ,\,\lambda_{n}} は全て実数であり、{n}個の互いに直交する単位固有ベクトル {\boldsymbol{u}_{1},\,\cdots ,\,\boldsymbol{u}_{n}} を持つ。

また、それらを列とする行列 {\boldsymbol{U} = \left[ \boldsymbol{u}_{1},\,\cdots ,\,\boldsymbol{u}_{n} \right]}直交行列である。

定理


直交行列

直交行列ってなんだっけ。

{n}個の互いに直交する{n}次元単位ベクトル {\boldsymbol{u}_{1},\,\cdots ,\,\boldsymbol{u}_{n}} を列とする{n\times n}行列

{\boldsymbol{U} = \begin{bmatrix}
\boldsymbol{u}_{1} & \cdots & \boldsymbol{u}_{n}
\end{bmatrix}}

を、直交行列と呼ぶ。

定義

定義は見ての通りなんだけど、いろいろ大事な性質があるんだよ。

証明は略すけど、こんな定理があったり。

{\boldsymbol{U}}が直交行列であることの必要十分条件は、次の通りである。

{\boldsymbol{U}^{t}\boldsymbol{U} = \boldsymbol{U}\boldsymbol{U}^{t} = \boldsymbol{I}}

ただし、{\boldsymbol{I}}単位行列である。

定理

なるほど、直交行列 {\boldsymbol{U}} の転置行列 {\boldsymbol{U}^{t}}逆行列 {\boldsymbol{U}^{-1}} に等しいということか。

そうだね。

うーむ。

実はこの直交行列、コンピュータグラフィックスの世界では回転や鏡像を作る行列としてめちゃくちゃよく使われるよ。

そうか。

直交行列は、大きさは変えずに、軸の向きだけを変えるチカラを持った行列だね。

そうだね。

しかも、原形をとどめたまま、原点を中心に軸をぐるりと回転させるイメージだよ。

なるほど分かってきたぞ。

直交行列 {\boldsymbol{U}}の転置行列 {\boldsymbol{U}^{t}} は、反対方向に同じだけ回転させるチカラを持っていて、結局、元の場所に戻せるから逆行列と同じということだね。

そういうこと。

さっきも言ったとおり、回転だけではなくて、鏡に映したように反転するケースもあるのだけど、結局おなじ話だよ。


対角化

ここまで集めてきた武器を使うと、対称行列対角行列に書き直すことができるんだよ。

これは非常に便利な変換なので、どんなに易しい大学でも、線型代数の講義を受ければ最低限ここまでは辿り着く。 ある意味、ひとつの目標地点だね。

習った記憶はあるかも。

でも、ボクのときは講義がそこで終わってしまって、結局、対角化したところで何が嬉しいのか、あんまりよく解らなかったな。

{n\times n} 対称行列  {\boldsymbol{A}}固有値{\lambda_{1},\, \cdots ,\, \lambda_{n}}、対応する単位固有ベクトル {\boldsymbol{u}_{1},\,\cdots ,\,\boldsymbol{u}_{n}}とする。 ここで、 {\boldsymbol{u}_{1},\,\cdots ,\,\boldsymbol{u}_{n}}を列とする直交行列 {\boldsymbol{U} = \begin{bmatrix}
\boldsymbol{u}_{1} & \cdots & \boldsymbol{u}_{n}
\end{bmatrix}}とすると、次が成り立つ。

 {\boldsymbol{U}^{t}\boldsymbol{A}\boldsymbol{U} = \begin{bmatrix}
\lambda_{1} & & & \\
& \lambda_{2} & & \\
& & \ddots & \\
& & & \lambda_{n}
\end{bmatrix}}

定理

この式は、ここまでの計算の集大成みたいになっているね。

まず固有値固有ベクトルの定義から、次が成り立つのは大丈夫?

 {
\begin{cases}
\boldsymbol{A}\boldsymbol{u}_{1} =\lambda_{1}\boldsymbol{u}_{1} \\
\boldsymbol{A}\boldsymbol{u}_{2} =\lambda_{2}\boldsymbol{u}_{2}\\
\qquad\vdots \\
\boldsymbol{A}\boldsymbol{u}_{n} =\lambda_{n}\boldsymbol{u}_{n}
\end{cases}}

ここまではなんとか。

次に {\boldsymbol{U}=\begin{bmatrix}
\boldsymbol{u}_{1} & \cdots & \boldsymbol{u}_{n}
\end{bmatrix}} を使って、{\boldsymbol{A}\boldsymbol{U}} を計算してみよう。

 {\begin{align}
\boldsymbol{A}\boldsymbol{U} &= \boldsymbol{A}\underbrace{\begin{bmatrix}
\boldsymbol{u}_{1} & \boldsymbol{u}_{2} & \cdots & \boldsymbol{u}_{n}
\end{bmatrix}}_{\boldsymbol{U}} \\
&= \begin{bmatrix}
\boldsymbol{A}\boldsymbol{u}_{1} & \boldsymbol{A}\boldsymbol{u}_{2} & \cdots & \boldsymbol{A}\boldsymbol{u}_{n}
\end{bmatrix}  \\
&= \begin{bmatrix}
\lambda_{1}\boldsymbol{u}_{1} & \lambda_{2}\boldsymbol{u}_{2} & \cdots & \lambda_{n}\boldsymbol{u}_{n}
\end{bmatrix}\\
&= \underbrace{\begin{bmatrix}
\boldsymbol{u}_{1} & \boldsymbol{u}_{2} & \cdots & \boldsymbol{u}_{n}
\end{bmatrix}}_{\boldsymbol{U}}\begin{bmatrix}
\lambda_{1} & & & \\
& \lambda_{2} & & \\
& & \ddots & \\
& & & \lambda_{n}
\end{bmatrix} \\
&= \boldsymbol{U}\begin{bmatrix}
\lambda_{1} & & & \\
& \lambda_{2} & & \\
& & \ddots & \\
& & & \lambda_{n}
\end{bmatrix}
\end{align}}

で、両辺に左から{ \boldsymbol{U}^{t}}を掛けるのだけど、{ \boldsymbol{U}} は直交行列だから { \boldsymbol{U}^{t}\boldsymbol{U} = \boldsymbol{I}} になることに注意して、、、

 {\require{cancel}
\begin{align}
\boldsymbol{U}^{t}\boldsymbol{A}\boldsymbol{U} &= \boldsymbol{U}^{t}\boldsymbol{U}\begin{bmatrix}
\lambda_{1} & & & \\
& \lambda_{2} & & \\
& & \ddots & \\
& & & \lambda_{n}
\end{bmatrix} \\
&= \cancel{\boldsymbol{U}^{t}\boldsymbol{U}}\begin{bmatrix}
\lambda_{1} & & & \\
& \lambda_{2} & & \\
& & \ddots & \\
& & & \lambda_{n}
\end{bmatrix} \\
&= \begin{bmatrix}
\lambda_{1} & & & \\
& \lambda_{2} & & \\
& & \ddots & \\
& & & \lambda_{n}
\end{bmatrix}
\end{align}}

これが、対称行列の対角化と呼ばれる操作だよ。

そうそう、確かこのへんまでは授業でやったんだよ。

だけど、これが何の役に立つかまではあんまり考察できなかったような……。

それは残念。。。

冒頭で、「固有ベクトルは、行列を作用させても向きが変わらないベクトルだ」みたいなことを言ったけど、もう一つの顔を持っていて、実はそっちの方が重要な性質を持っているんだよー。

ふむ……。

先にタネを明かすと、主成分分析とかKL展開とか言われているあたりから、この辺の話が面白くなってくるのだけど、そこに辿り着くには発想の転換というか、見方を変える必要があったり。

なるほど、、、ぜひ続きを。

そうだねー。。

まぁ、今日はこの辺にして、また次回。


おさらい

今日の要点はこんなところかな。

意外と忘れていることが多かった……。


  • 対称行列 {\boldsymbol{A}} はその固有値 {\lambda_{1},\,\cdots ,\,\lambda_{n}}固有ベクトル {\boldsymbol{u}_{1},\,\cdots ,\,\boldsymbol{u}_{n}} を使って対角化できる
  • 対称行列 {\boldsymbol{A}}固有値 {\lambda_{1},\,\cdots ,\,\lambda_{n}} は必ず実数である
  • 対称行列 {\boldsymbol{A}}固有ベクトル {\boldsymbol{u}_{1},\,\cdots ,\,\boldsymbol{u}_{n}} は互いに直交する
  • 直交行列 {\boldsymbol{U}} は、回転と鏡映を合わせた写像である
    つまり{\boldsymbol{x}' = \boldsymbol{U}\boldsymbol{x}} と変換しても、回転するだけで形は変わらない
  • 直交行列 {\boldsymbol{U}} の転置行列 {\boldsymbol{U}^{t}} は、逆行列 {\boldsymbol{U}^{-1}} に等しい

今日のポイント

出発地点が適当な上に証明も飛ばしまくったけど、そこを突っ込み始めるといつまでも話が先に進まないので、もしどうしても気になるなら線型代数の教科書を読んでくださいー。


おまけ

コンピュータグラフィックスの世界で、物体をぐるぐる回す計算に直交行列が使われているよ。


主成分分析は、特徴量の次元削減などに使っていました。

あと、密な3次元の点群を2次元平面に写してローポリ化したり。


なるほど、数式をこねくり回しているだけでは全くイメージできん。

まぁ追い追いその辺の話もできたらなぁと思います。

あ、僕たちは厳密な議論ができないので、もしガチ勢の方が運悪くこのブログを見つけてしまったとしても、まさかりを振り下ろしたりせず、あたたかく見守っていただければ幸いです。 ではまた。


Copyright (c) 2012 @tercel_s, @iTercel, @pi_cro_s.