ちょっと新たな試みで、数学の小ネタの雑談コーナーをはじめるよ!
急にどうした!?
この前、とらじろーさんのブログ を読んで触発されたので……。
僕も数学の楽しさを再発見できたらなーと思ったのでした。
なるほど。
そんなわけで今日は、行列の固有値・対角化について、まったり話そうと思うよー。
行列 は、ベクトルの向きと大きさをどちらも変えるチカラを持っているけど、スカラー はベクトルの大きさを変えるチカラしか無いんだよね。
うん。
なので、固有ベクトルは、行列 のチカラをもってしてもなお向きが変わらない特別なベクトルということになるね。
なるほどなるほど。
めんどくさいので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]]
これは、どう見ればいいの?
いきなり答えが出てきちゃったけど、これって合ってるの?
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]
おー、なんか合ってそうだね。
そうだね。
対称行列
ここからは雑談なのだけど、実際に固有値問題を解く必要が生じるのは、だいたい対称行列の場合だけだよ。
なぜに。
ふむ。
なのでここから先は、特に断りがない限り、対称行列のみを扱うものとして話をするよ。
そうすると、何がうれしいの?
直交行列
直交行列ってなんだっけ。
個の互いに直交する次元単位ベクトル を列とする行列
を、直交行列と呼ぶ。
定義は見ての通りなんだけど、いろいろ大事な性質があるんだよ。
証明は略すけど、こんな定理があったり。
なるほど、直交行列 の転置行列 は逆行列 に等しいということか。
そうだね。
うーむ。
実はこの直交行列、コンピュータグラフィックスの世界では回転や鏡像を作る行列としてめちゃくちゃよく使われるよ。
そうか。
直交行列は、大きさは変えずに、軸の向きだけを変えるチカラを持った行列だね。
そうだね。
しかも、原形をとどめたまま、原点を中心に軸をぐるりと回転させるイメージだよ。
なるほど分かってきたぞ。
直交行列 の転置行列 は、反対方向に同じだけ回転させるチカラを持っていて、結局、元の場所に戻せるから逆行列と同じということだね。
そういうこと。
さっきも言ったとおり、回転だけではなくて、鏡に映したように反転するケースもあるのだけど、結局おなじ話だよ。
対角化
ここまで集めてきた武器を使うと、対称行列を対角行列に書き直すことができるんだよ。
これは非常に便利な変換なので、どんなに易しい大学でも、線型代数の講義を受ければ最低限ここまでは辿り着く。 ある意味、ひとつの目標地点だね。
習った記憶はあるかも。
でも、ボクのときは講義がそこで終わってしまって、結局、対角化したところで何が嬉しいのか、あんまりよく解らなかったな。
この式は、ここまでの計算の集大成みたいになっているね。
ここまではなんとか。
次に を使って、 を計算してみよう。
で、両辺に左からを掛けるのだけど、 は直交行列だから になることに注意して、、、
これが、対称行列の対角化と呼ばれる操作だよ。
そうそう、確かこのへんまでは授業でやったんだよ。
だけど、これが何の役に立つかまではあんまり考察できなかったような……。
それは残念。。。
冒頭で、「固有ベクトルは、行列を作用させても向きが変わらないベクトルだ」みたいなことを言ったけど、もう一つの顔を持っていて、実はそっちの方が重要な性質を持っているんだよー。
ふむ……。
先にタネを明かすと、主成分分析とかKL展開とか言われているあたりから、この辺の話が面白くなってくるのだけど、そこに辿り着くには発想の転換というか、見方を変える必要があったり。
なるほど、、、ぜひ続きを。
そうだねー。。
まぁ、今日はこの辺にして、また次回。
おさらい
今日の要点はこんなところかな。
意外と忘れていることが多かった……。
出発地点が適当な上に証明も飛ばしまくったけど、そこを突っ込み始めるといつまでも話が先に進まないので、もしどうしても気になるなら線型代数の教科書を読んでくださいー。
おまけ
コンピュータグラフィックスの世界で、物体をぐるぐる回す計算に直交行列が使われているよ。
おまけ: 鉛直軸まわりに回した。
— たーせる (@tercel_s) 2021年8月13日
いつかコロナ禍が明けたらビアガーデンいきたい。 #WebGL2 pic.twitter.com/pjZXYoQ3x1
主成分分析は、特徴量の次元削減などに使っていました。
あと、密な3次元の点群を2次元平面に写してローポリ化したり。
これも2010年頃にTwitterに投下したものらしい。が、もはやほぼ記憶にない。
— たーせる (@tercel_s) 2020年2月13日
1冊目はふつうのアプリケーション開発用のメモ。
2冊目はゲームプログラミングのためのノートだったようだ。が、書いてある数式は多変量解析(主成分分析)だな。
スクショに3Dっぽいなにかが写ってる。 pic.twitter.com/IXCEtpHpsZ
なるほど、数式をこねくり回しているだけでは全くイメージできん。
まぁ追い追いその辺の話もできたらなぁと思います。
あ、僕たちは厳密な議論ができないので、もしガチ勢の方が運悪くこのブログを見つけてしまったとしても、鉞を振り下ろしたりせず、あたたかく見守っていただければ幸いです。 ではまた。