小学算数1203731 views
高校化学2933198 views
MathPython501700 views
高校生物553211 views
ヒストリア294981 views
小学理科721729 views
数学講師2913151 views
高校日本史191026 views
中学数学625176 views
高校国語790013 views
Help
Tools

English

スペクトル分解とは|対称行列の対角化から行列の関数まで

対称行列は、固有値を重みにした射影の足し算に開ける。

これがスペクトル分解である。行列を「どの向きにどれだけ伸ばすか」という情報だけに分けた形で、累乗も平方根も逆行列も、この形からそのまま作れる。

対角化からスペクトル分解へ

実対称行列は直交行列で対角化できる。固有ベクトルを正規直交に取り、それを列に並べた行列を とすればよい。

は固有値を並べた対角行列である。 が直交行列なので、逆行列を求めずに転置で書ける点がこの形の利点になる。

同じ内容を、行列の積を使わずに書き直したい。そこで右辺を成分の並びとして展開する。

射影の和に開く

を列ごとに分けると、固有値を重みとする和になる。

は列ベクトルと行ベクトルの積なので、 次の正方行列である。階数は 1 で、 の向きだけを取り出す射影行列になっている。

行列を階数 1 の部品に分け、それぞれに固有値の重みを付けた形だと読める。 の対角成分が重み、 の列が向きを担当している。

例:2 次の対称行列を分解する

固有値は 4 と 2 で、正規化した固有ベクトルは と である。それぞれから射影を作る。

を計算すると と の和になり、 に戻る。

射影行列の性質

分解に現れる は、次の 3 つを満たす。どれも が正規直交であることから出る。

さらに全部を足すと単位行列になる。 だからである。

2 乗しても変わらないのは、射影を 2 度かけても結果が動かないことを表す。異なる射影の積が 0 になるのは、向きがたがいに直交しているためである。

例:射影の性質を確かめる

先ほどの を 2 乗する。成分はすべて なので、積の各成分は になる。

を計算すると、各成分で と が打ち消し合って零行列になる。 のほうは、非対角成分が消えて単位行列である。

ベクトルへの作用として読む

を分解の形で書くと、 を固有方向に分けてから伸縮する手順が見えてくる。

は の 方向の成分である。それを 倍して足し直したものが になる。

行列を掛ける操作が、向きごとの独立な伸び縮みに分かれている。固有値が大きい向きほど強く引き伸ばされる。

HTML
CSS
JavaScript
<svg viewBox="0 0 460 230" width="100%" style="max-width:460px;display:block;margin:0 auto">
	<text x="230" y="22" font-size="11" fill="#9a9a9a" text-anchor="middle">固有方向に分けてから、別々に伸ばして足し直す</text>
	<line x1="60" y1="170" x2="420" y2="170" stroke="#c8c8c8" stroke-width="1"></line>
	<line x1="110" y1="200" x2="110" y2="50" stroke="#c8c8c8" stroke-width="1"></line>
	<line x1="110" y1="170" x2="180" y2="100" stroke="#c8c8c8" stroke-width="1" stroke-dasharray="4 3"></line>
	<line x1="110" y1="170" x2="180" y2="240" stroke="#c8c8c8" stroke-width="1" stroke-dasharray="4 3"></line>
	<line x1="110" y1="170" x2="166" y2="142" stroke="#1f1f1f" stroke-width="1.5"></line>
	<polygon points="172,139 162,139 165,146" fill="#1f1f1f"></polygon>
	<text x="176" y="136" font-size="12" fill="#1f1f1f">x</text>
	<line x1="110" y1="170" x2="152" y2="128" stroke="#1b81e0" stroke-width="1.5"></line>
	<polygon points="156,124 146,126 152,132" fill="#1b81e0"></polygon>
	<text x="120" y="120" font-size="11" fill="#1b81e0">q1 方向</text>
	<line x1="110" y1="170" x2="138" y2="184" stroke="#d0562a" stroke-width="1.5"></line>
	<polygon points="143,186 133,186 137,180" fill="#d0562a"></polygon>
	<text x="146" y="198" font-size="11" fill="#d0562a">q2 方向</text>
	<line x1="250" y1="170" x2="330" y2="90" stroke="#1b81e0" stroke-width="1.5"></line>
	<polygon points="334,86 324,88 330,94" fill="#1b81e0"></polygon>
	<text x="286" y="104" font-size="11" fill="#1b81e0">4 倍</text>
	<line x1="250" y1="170" x2="292" y2="191" stroke="#d0562a" stroke-width="1.5"></line>
	<polygon points="297,193 287,193 291,187" fill="#d0562a"></polygon>
	<text x="300" y="206" font-size="11" fill="#d0562a">2 倍</text>
	<text x="250" y="66" font-size="11" fill="#9a9a9a">伸ばしてから足すと Ax</text>
</svg>

例:ベクトルを分解して伸縮を見る

を先ほどの で送る。まず 方向と 方向の成分を取る。

、 である。これらを 4 倍と 2 倍してから足し直す。

答えは である。 を直接掛けても で同じ値になる。

固有値が重なるときは固有空間ごとにまとめる

固有値が重なると、固有ベクトルの取り方に自由が生まれる。重なった分だけ固有空間が広がり、その中でどの正規直交基底を選んでもよい。

そこで、同じ固有値に属する項をまとめてしまう。まとめた は、その固有空間への直交射影になる。

和を取る範囲は、相異なる固有値だけである。この形にすると、基底の選び方に左右されない書き方になる。

例:重複した固有値の射影

固有値 2 の固有空間は、はじめの 2 つの座標が張る平面である。ここへの射影は、対角成分が の行列になる。

固有値 5 の射影は である。 を計算すれば に戻る。

平面の中で基底をどう回しても、射影そのものは変わらない。個々の固有ベクトルは一意でなくても、分解は動かない。

例:3 次の行列を対角でない形で分解する

成分がすべて 1 の行列を と書けば である。 の固有値は 3 と 0(重複度 2)なので、 の固有値は 4 と 1 になる。

固有値 4 の向きは で、射影は である。固有値 1 の固有空間は の平面で、射影は になる。

平面のほうは 2 次元なので、その中の固有ベクトルは何通りにも取れる。それでも射影は の 1 つに決まっている。

分解は一通りに決まる

相異なる固有値ごとにまとめた形で書けば、スペクトル分解は一意である。固有値も射影も、行列 から決まってしまう。

理由は が固有空間への直交射影として特徴づけられることにある。固有空間は だけで決まり、そこへの直交射影も 1 つしかない。

一方、 のほうは一意ではない。列の順序を入れ替えたり、符号を反転したりできる。分解の一意性は、射影の言葉で述べたときにだけ成り立つ。

行列の関数を作る

の多項式を作ると、 のおかげで交差項が消える。 を展開すれば、 の和が残る。

同じことが何乗でも起きるので、多項式は固有値だけに作用する。この観察を、多項式でない関数にも広げる。

これを行列の関数の定義に採用する。固有値のところで を評価し、射影で組み直すだけである。

例:n 乗を求める

となる。 で確かめてみる。

を 2 回掛けても同じ行列が出る。指数が大きくなっても、計算するのは固有値の累乗だけで済む。

例:平方根を求める

固有値が正なので、平方根を取っても実行列にとどまる。重みを と に取り替える。

成分で書くと、対角が 、非対角が の対称行列になる。2 乗すると、対角は和が 3、非対角は積の 2 倍が 1 となり、 に戻る。

固有値に負のものがあれば、実の範囲では平方根が取れない。正定値であることが、ここで効いてくる。

例:逆行列を求める

重みを逆数に取り替えれば逆行列になる。固有値が 0 でなければ、いつでもこの形が使える。

行列式が 8 なので、2 次の逆行列の公式と突き合わせても一致する。固有値のどれかが 0 なら逆数が作れず、逆行列も存在しない。

トレースと行列式の読み替え

分解の形からは、トレースと行列式も読める。トレースは固有値の和、行列式は積である。

例に当てはめると、トレースは で、対角成分の和 に一致する。行列式は である。

射影のトレースが固有空間の次元になることも使える。重複した固有値では、次元の分だけ重みが数えられる。

二次形式の主軸として見る

二次形式に代入すると、交差項のない形になる。 を分解で書けば、平方の重み付き和である。

固有ベクトルの向きに座標軸を取り直した、と読める。楕円や双曲線の主軸が固有ベクトルの向きになるのは、この式のためである。

符号を決めるのが固有値なので、正定値かどうかもここから判断できる。

低ランク近似

固有値の大きい項ほど、行列への寄与が大きい。そこで小さい項を切り捨てると、階数の低い近似が得られる。

HTML
CSS
JavaScript
<svg viewBox="0 0 460 190" width="100%" style="max-width:460px;display:block;margin:0 auto">
	<text x="230" y="24" font-size="11" fill="#9a9a9a" text-anchor="middle">重みの大きい項だけを残す</text>
	<rect x="60" y="60" width="90" height="70" fill="#1b81e0" fill-opacity="0.22" stroke="#1b81e0" stroke-width="1"></rect>
	<text x="105" y="100" font-size="12" fill="#1b81e0" text-anchor="middle">λ1 P1</text>
	<text x="163" y="100" font-size="13" fill="#9a9a9a">+</text>
	<rect x="180" y="75" width="90" height="40" fill="#1b81e0" fill-opacity="0.10" stroke="#c8c8c8" stroke-width="1"></rect>
	<text x="225" y="100" font-size="12" fill="#9a9a9a" text-anchor="middle">λ2 P2</text>
	<text x="283" y="100" font-size="13" fill="#9a9a9a">+</text>
	<rect x="300" y="85" width="90" height="20" fill="#1b81e0" fill-opacity="0.05" stroke="#c8c8c8" stroke-width="1"></rect>
	<text x="345" y="100" font-size="12" fill="#9a9a9a" text-anchor="middle">λ3 P3</text>
	<line x1="180" y1="140" x2="390" y2="140" stroke="#d0562a" stroke-width="1" stroke-dasharray="4 3"></line>
	<text x="285" y="158" font-size="11" fill="#d0562a" text-anchor="middle">ここから先を落とすと階数 1 の近似になる</text>
	<text x="105" y="52" font-size="11" fill="#1b81e0" text-anchor="middle">重みが最大</text>
</svg>

どこまで残すかは、落とした固有値の大きさで測れる。誤差はそのまま切り捨てた項の重みになる。

例:項を 1 つ落とす

例の で、重みの小さい第 2 項を落とす。残るのは階数 1 の行列である。

もとの との差は で、成分の絶対値は 1 である。対角成分は 3 から 2 へ、非対角成分は 1 から 2 へずれた。

主成分分析はこの考え方を使う。共分散行列を分解し、重みの大きい向きだけを残して次元を落とす。

正規行列・エルミート行列への一般化

複素数まで広げると、対称行列の代わりにエルミート行列が同じ性質を持つ。直交行列はユニタリ行列に、転置は共役転置に置き換わる。

固有値が実数になるので、係数は実のままである。さらに広げると、正規行列であればこの形の分解ができる。ただし固有値は複素数になりうる。

どこまでこの形が使えるかを決めるのが正規性である。証明や条件は正規行列の記事で扱う。

他の話題とのつながり

特異値分解は、正方でない行列に同じ考え方を持ち込んだものである。左右で別々の正規直交基底を使う点が違う。

正定値行列の平方根や、指数関数を使った微分方程式の解も、この分解から作れる。関数を固有値に作用させるだけで済むからである。

対称行列でない行列には、この形はそのまま使えない。対角化できたとしても、射影は直交射影にならず、性質がいくつか失われる。

よくある誤り

どんな行列でもスペクトル分解できると考える。対称行列や正規行列に限った話である
と を取り違える。前者は行列、後者は 1 になるスカラーである
固有ベクトルを正規化せずに射影を作る。長さが 1 でなければ が成り立たない
固有値が重なったとき、固有ベクトルが一意に決まると思ってしまう。決まるのは固有空間とその射影のほうである
を成分ごとに を当てたものと混同する。作用させる相手は固有値であって、成分ではない
低ランク近似で切り捨てた誤差を 0 と見なす。落とした項の重みがそのまま残差になる
分解に現れる射影が交換しないと考える。異なる射影の積は零行列で、同じものの積はそれ自身である

参考文献

Spectral theorem - Wikipedia
Eigendecomposition of a matrix - Wikipedia
Spektralsatz - Wikipedia(ドイツ語)
Théorème spectral - Wikipédia(フランス語)
対称行列は、固有値を重みにした射影の足し算に開けます。対角化から分解を導く手順、射影が満たす性質、固有空間ごとにまとめると分解が一通りに決まること、固有値に関数を当てるだけで行列の関数が作れること、主成分分析につながる低ランク近似までを、計算例をつけて示します。