こんにちは、二回生に三人いるたつやの中の一人です。
もうじきクリスマスだというのに、数学っぽい記事を黙々と読んでは課題の処理を繰り返す日々を送っています。(みんなで飲み会とかしたい)
今年は線形代数の逆行列を求めるプログラム(ライブラリは使わず、理論に基づいて組んでいます)を組んだり、数値解析で微分方程式を解くプログラムを組んだりしておりました。(今度こそこれらの知識をフルに活用して面白い物を作ってやろうと企んでおります)
固有値解析とは
今回、紹介するのは「固有値解析」です。具体的には行列の固有値や固有ベクトルを求める手法達のことです。
「難しそうな匂いがする…まぢむり…ブラウザバックしよ…」となる方もいらっしゃるかも知れませんが、中には「あら?こんな単純な操作を繰り返すだけ?」といった簡単な手法も存在します。
しかし私の説明力では複雑な手法を説明できる気がしません。
なので、簡単でお手軽な手法の一つを紹介します。(行列、ベクトルの四則演算が分かる人を想定しています)
固有値、固有値ベクトルって何?
「そもそも固有ベクトルの固有値ってなんだっけ?(鼻ホジ)」「線形代数忘れた(^^)」といった方々もいるかも知れません。なので簡単な説明をいたします。
適当なベクトルuと行列Aの積A・uを考えます。

このような、なんの変哲もない行列のかけ算の結果になります。
そこで、行列Aの固有ベクトルkuと固有値λを求めると、

といった二組の固有値、固有ベクトルが現れます。
今度はこの行列Aと固有ベクトルkuでの積を試みると以下のような性質が表れます。

このように、行列と固有ベクトルとの積が、固有ベクトルの固有値倍に等しくなっているのです!
この性質を持つ数字とベクトルの組が固有値、固有ベクトルの正体です。
べき乗法
上記では省いた固有値の求め方、一体どうやって求めるのでしょうか?
ちなみに手計算で求める場合は、以下の固有値の定義を用いて求めます。

※detは行列積を表します。
この行列積がやっかいなものでして、行列Aのサイズが大きくなればなるほど計算が大変になっていきます。コンピュータで計算するにも同様に大変計算量が大きいのです。
そこで過去の名だたる数学者達は、ある操作を繰り替えす事で近似的に解を求める手法(反復法と言う)を編み出しました。
その手法の一つに「べき乗法」なる手法が存在します。
この手法は対象となる行列の最大の固有値を求める手法であり、具体的な方法は固有値を求める対象となる行列Aに以下の操作を行います。
- |x| = 1となる初期ベクトルxを生成
- y = Ax, λ = (x, y)
- x = y / |y|
- λが十分に収束するまで2.へ分岐
この反復を行って得たλが行列の最大固有値となります!これなら簡単にプログラムで実装できそう!(なぜ収束するかの証明がありますが割愛します)
こんな単純な4ステップで固有値が求まるなんて、数学って不思議ですよねぇ…
(※他のもっと便利な手法は、幾つかの行列の分解や変換操作を組み合わせて行ったりします。ほんとよく思いつくな…)
終わりに
周りの友達にこういった数学寄りのアルゴリズムを説明しても「これが出来たから何が楽しいの?」みたいな目で見られますが、それは誤解です。これらの固有値、固有ベクトルは大変有用で様々なプログラムに利用されています。(自分は主にデータ解析でかなりの頻度で見かけます。)ぶっちゃけライブラリに任せた方が高速 理論を知ることでさらなる境地にたどり着けると信じて来年も精進していきます。
長文ありがとうございました、では良いお年を~