特異値分解

導入

固有値分解で、
X*X = VΛV* 、また XX* = UΛU*

となることがわかった。
これにちょっと細工をする。
ΣΣ = Λ 、とまあ固有値のルートをとってΣと表す。
するとX*X = VΣΣV* 、また XX* = UΣΣU*

Vはユニタリ行列なので V*V = I だから
XX* = UΣV*VΣU*

ここで、X = UΣV* なら、ぜんぶ説明できるんじゃない? って示唆される。 (X* = VΣU*)
それ必要十分じゃないから、ちゃんと別に証明が必用で、スペクトル定理からもってくるらしい。
(ごめん私はその解説に適任でないです。)

しかしまあ X = UΣV*はじつは正しくて、これをXの特異値分解という。
固有値分解の上位概念と考えていいだろう。
まずは、Xが正規であるという制限がない。どころか、正方でなくてもいい。
欠損値さえなければOK。
あるいみ、2つの計算をいっぺんにやっちゃった形になっている。

行列の次元

Xがたとえばm n 列の行列で、m 個のサンプルをn 種類の測定項目で測ったとする。
ふつう、m > n が多いことでしょう
(マイクロアレイみたいに測定項目が何万もある測定ってのは、まだ珍しいはず)。

すると、Uはm m 列の、 Σはm n 列の、 Vはn n 列の、 行列になる。

UとVはユニタリ行列だけど、このとき、
よりサイズが大きい行列であるUのn列目以降の右側列が実質的に0行列になる。

またΣは対角に数字が並ぶが、それをたどっていちばん下までいったときに右側が余っている。
だからほんとうは ΣΣ = Λ これとちょっと違ってる、これは正方行列だから。

じつは XX* = UΛU*で求めたときも同じことは起きている。
固有値eigenvalueはn 個しか求まらない。

ちょっと実務的な話をすると、Rで計算させるとき、
eigen() を使って固有値分解をすると、この実質ゼロのところをねちこく計算して、
えらいメモリー食うわ時間も食うわでイライラします。意味ないって、そこは。ゼロだって原理的に。

しかし特異値分解のアルゴリズムを使う関数 svd()だと答は一瞬ででます。
Uもクールに、ゼロになるところは返しません(のでUが正方行列でかえらない)。

また、eigenでやっちゃうとUとVの方向がうまく一致してくれないことがしばしば。
そりゃそうだ。

さて X = UΣV* には、ある意味、
e = cosθ + i sinθ  のような美しさが内包されてます。
どんな行列データも、方向と長さと回転に分解できるってのがそのフィジカルな意味ですが、そこを次に。

目次にもどる