スペクトル分解とは|対称行列の対角化から行列の関数まで
対称行列は、固有値を重みにした射影の足し算に開ける。
これがスペクトル分解である。行列を「どの向きにどれだけ伸ばすか」という情報だけに分けた形で、累乗も平方根も逆行列も、この形からそのまま作れる。
対角化からスペクトル分解へ
実対称行列は直交行列で対角化できる。固有ベクトルを正規直交に取り、それを列に並べた行列を とすればよい。
は固有値を並べた対角行列である。 が直交行列なので、逆行列を求めずに転置で書ける点がこの形の利点になる。
同じ内容を、行列の積を使わずに書き直したい。そこで右辺を成分の並びとして展開する。
射影の和に開く
を列ごとに分けると、固有値を重みとする和になる。
は列ベクトルと行ベクトルの積なので、 次の正方行列である。階数は 1 で、 の向きだけを取り出す射影行列になっている。
行列を階数 1 の部品に分け、それぞれに固有値の重みを付けた形だと読める。 の対角成分が重み、 の列が向きを担当している。
例:2 次の対称行列を分解する
固有値は 4 と 2 で、正規化した固有ベクトルは と である。それぞれから射影を作る。
を計算すると と の和になり、 に戻る。
射影行列の性質
分解に現れる は、次の 3 つを満たす。どれも が正規直交であることから出る。
さらに全部を足すと単位行列になる。 だからである。
2 乗しても変わらないのは、射影を 2 度かけても結果が動かないことを表す。異なる射影の積が 0 になるのは、向きがたがいに直交しているためである。
例:射影の性質を確かめる
先ほどの を 2 乗する。成分はすべて なので、積の各成分は になる。
を計算すると、各成分で と が打ち消し合って零行列になる。 のほうは、非対角成分が消えて単位行列である。
ベクトルへの作用として読む
を分解の形で書くと、 を固有方向に分けてから伸縮する手順が見えてくる。
は の 方向の成分である。それを 倍して足し直したものが になる。
行列を掛ける操作が、向きごとの独立な伸び縮みに分かれている。固有値が大きい向きほど強く引き伸ばされる。
<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 なら逆数が作れず、逆行列も存在しない。
トレースと行列式の読み替え
分解の形からは、トレースと行列式も読める。トレースは固有値の和、行列式は積である。
例に当てはめると、トレースは で、対角成分の和 に一致する。行列式は である。
射影のトレースが固有空間の次元になることも使える。重複した固有値では、次元の分だけ重みが数えられる。
二次形式の主軸として見る
二次形式に代入すると、交差項のない形になる。 を分解で書けば、平方の重み付き和である。
固有ベクトルの向きに座標軸を取り直した、と読める。楕円や双曲線の主軸が固有ベクトルの向きになるのは、この式のためである。
符号を決めるのが固有値なので、正定値かどうかもここから判断できる。
低ランク近似
固有値の大きい項ほど、行列への寄与が大きい。そこで小さい項を切り捨てると、階数の低い近似が得られる。
<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 へずれた。
主成分分析はこの考え方を使う。共分散行列を分解し、重みの大きい向きだけを残して次元を落とす。
正規行列・エルミート行列への一般化
複素数まで広げると、対称行列の代わりにエルミート行列が同じ性質を持つ。直交行列はユニタリ行列に、転置は共役転置に置き換わる。
固有値が実数になるので、係数は実のままである。さらに広げると、正規行列であればこの形の分解ができる。ただし固有値は複素数になりうる。
どこまでこの形が使えるかを決めるのが正規性である。証明や条件は正規行列の記事で扱う。
他の話題とのつながり
特異値分解は、正方でない行列に同じ考え方を持ち込んだものである。左右で別々の正規直交基底を使う点が違う。
正定値行列の平方根や、指数関数を使った微分方程式の解も、この分解から作れる。関数を固有値に作用させるだけで済むからである。
対称行列でない行列には、この形はそのまま使えない。対角化できたとしても、射影は直交射影にならず、性質がいくつか失われる。











