特異値分解とは|正方でない行列にも使える分解と、その意味
どんな行列も、回転と伸縮と回転の 3 段階に分けられる。
と は直交行列で、 は対角に非負の数が並ぶ行列である。正方でなくても、階数が足りなくても、この形にできる。対角化が使えない行列にも通じる分解になっている。
特異値分解の形
の対角に並ぶ数を特異値といい、大きい順に と並べる。負の値は現れない。
の列を左特異ベクトル、 の列を右特異ベクトルという。どちらも正規直交で、 が先に働き、 が最後に働く。
対角化 とは形が違う。両側で別々の直交行列を使うので、 と のように対で打ち消し合う関係にはない。
行列の大きさの対応
が の行列なら、 は 次、 は 次の正方行列である。 は と同じ で、対角の外はすべて 0 になる。
特異値の個数は と の小さいほうまでである。縦長なら列の数だけ、横長なら行の数だけ並ぶ。
行の数と列の数が違っても分解できる点が、対角化との大きな違いである。対角化は正方行列にしか定義できない。
特異値は転置との積から出る
を使って を作ると、 が中央で打ち消し合う。
右辺は対称行列の対角化の形である。したがって の固有値が で、固有ベクトルが右特異ベクトルになる。
は半正定値なので固有値は 0 以上であり、平方根が取れる。特異値が非負なのは、この作り方のためである。
例:2 次の行列で特異値を求める
を計算すると になる。固有値は と である。
平方根を取って、特異値は と になる。積は 4 で、 の行列式の絶対値と一致する。
固有値そのものを求めると は複素固有値を持つが、特異値はいつでも実数である。
特異ベクトルの対応
右特異ベクトル に を掛けると、左特異ベクトルの 倍になる。
つまり から へ、伸縮の倍率だけを伴って移る。転置のほうも同じ関係で、 が成り立つ。
の固有ベクトルとして を求めてから、この式で を作るのが手順である。
例:v から u を作る
先ほどの行列で試す。 の固有ベクトルは と である。
に を掛けると 、つまり になる。長さが なので、 である。
同じように となり、 が得られる。分解は次の形にまとまる。
単位円は楕円に写る
分解の 3 段階を図形で追うと、意味がはっきりする。 が座標軸を回し、 が軸方向に伸ばし、 がもう一度回す。
<svg viewBox="0 0 460 180" width="100%" style="max-width:460px;display:block;margin:0 auto">
<circle cx="70" cy="95" r="38" fill="#1b81e0" fill-opacity="0.08" stroke="#1b81e0" stroke-width="1.5"></circle>
<text x="70" y="30" font-size="11" fill="#1f1f1f" text-anchor="middle">単位円</text>
<line x1="122" y1="95" x2="152" y2="95" stroke="#9a9a9a" stroke-width="1"></line>
<polygon points="157,95 148,91 148,99" fill="#9a9a9a"></polygon>
<text x="139" y="86" font-size="10" fill="#9a9a9a" text-anchor="middle">Σ</text>
<ellipse cx="230" cy="95" rx="62" ry="26" fill="#1b81e0" fill-opacity="0.08" stroke="#1b81e0" stroke-width="1.5"></ellipse>
<text x="230" y="30" font-size="11" fill="#1f1f1f" text-anchor="middle">軸方向に伸縮</text>
<line x1="302" y1="95" x2="332" y2="95" stroke="#9a9a9a" stroke-width="1"></line>
<polygon points="337,95 328,91 328,99" fill="#9a9a9a"></polygon>
<text x="319" y="86" font-size="10" fill="#9a9a9a" text-anchor="middle">U</text>
<ellipse cx="395" cy="95" rx="62" ry="26" fill="#1b81e0" fill-opacity="0.08" stroke="#1b81e0" stroke-width="1.5" transform="rotate(-35 395 95)"></ellipse>
<text x="395" y="30" font-size="11" fill="#1f1f1f" text-anchor="middle">回して置き直す</text>
<text x="230" y="166" font-size="11" fill="#9a9a9a" text-anchor="middle">半軸の長さがそのまま特異値になる</text>
</svg>できあがる楕円の半軸の長さが、特異値そのものである。いちばん伸びる向きが 、いちばん縮む向きが最小の特異値にあたる。
行列を掛ける操作が、向きの取り替えと軸方向の伸縮に分かれている。ゆがみに見えるものが、この 3 つの組み合わせで説明できる。
例:楕円の半軸を読む
例の行列で単位円を送ると、半軸が と の楕円になる。長いほうの向きが 、短いほうが である。
面積の比も計算できる。もとの円の面積に を掛けたものが、楕円の面積になる。
この 4 は行列式の絶対値と同じである。行列式が面積の拡大率を表すことと、特異値の積が一致する。
階数は零でない特異値の個数
特異値のうち 0 でないものの個数が、そのまま階数になる。 の対角に残る成分の数を数えればよい。
伸縮の倍率が 0 の向きは、写した先でつぶれてしまう向きである。つぶれずに残る向きの本数が階数だと読める。
数値計算では、小さすぎる特異値を 0 と見なして階数を判定する。丸め誤差で完全な 0 にならないためで、どこで切るかは扱う問題による。
例:階数が落ちる行列を分解する
第 2 行は第 1 行の 2 倍なので、階数は 1 である。 は で、固有値は 25 と 0 になる。
特異値は 5 と 0 で、0 でないものは 1 つだけである。個数が階数と一致している。
を取ると の長さが 5 になり、 も同じ向きになる。分解は 1 項だけで書ける。
縮小版と階数 1 の和
零の特異値に対応する列は、掛けても何も生まない。そこを削った形を縮小版という。
さらに項ごとに分けると、階数 1 の行列の和になる。
は階数である。それぞれの項は「 の向きを見て の向きへ出す」という単純な行列で、重みが特異値になっている。
<svg viewBox="0 0 460 170" 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>
<rect x="40" y="45" width="40" height="90" fill="#1b81e0" fill-opacity="0.10" stroke="#1b81e0" stroke-width="1"></rect>
<text x="60" y="94" font-size="11" fill="#1b81e0" text-anchor="middle">A</text>
<text x="60" y="152" font-size="10" fill="#9a9a9a" text-anchor="middle">m × n</text>
<text x="96" y="94" font-size="12" fill="#9a9a9a">=</text>
<rect x="120" y="45" width="90" height="90" fill="#1b81e0" fill-opacity="0.10" stroke="#1b81e0" stroke-width="1"></rect>
<text x="165" y="94" font-size="11" fill="#1b81e0" text-anchor="middle">U</text>
<text x="165" y="152" font-size="10" fill="#9a9a9a" text-anchor="middle">m × m</text>
<rect x="222" y="45" width="40" height="90" fill="#1b81e0" fill-opacity="0.10" stroke="#1b81e0" stroke-width="1"></rect>
<line x1="222" y1="45" x2="262" y2="85" stroke="#1b81e0" stroke-width="1"></line>
<text x="242" y="110" font-size="11" fill="#1b81e0" text-anchor="middle">Σ</text>
<text x="242" y="152" font-size="10" fill="#9a9a9a" text-anchor="middle">m × n</text>
<rect x="274" y="45" width="40" height="40" fill="#1b81e0" fill-opacity="0.10" stroke="#1b81e0" stroke-width="1"></rect>
<text x="294" y="70" font-size="11" fill="#1b81e0" text-anchor="middle">V</text>
<text x="294" y="102" font-size="10" fill="#9a9a9a" text-anchor="middle">n × n</text>
<text x="360" y="70" font-size="10" fill="#9a9a9a">対角の下は 0 なので</text>
<text x="360" y="88" font-size="10" fill="#9a9a9a">U の右側は使われない</text>
</svg>例:階数 1 の和に開く
例の行列を 2 つの項に分ける。 を計算すると、第 1 行だけが残る行列になる。
第 2 項も同じように計算すると になる。2 つを足すと、もとの に戻る。
正方でない行列でも取れる
行と列の数が違っても、手順は変わらない。 は 次の対称行列なので、右特異ベクトルはそこから求まる。
左特異ベクトルは を正規化して得る。特異値が 0 の向きでは が零ベクトルになるので、そこは別に補う。
対角化ができない場面でも使えることが、この分解の強みである。固有値が定義できない縦長の行列にも、特異値なら定義できる。
例:縦長の行列を分解する
は 2 次の行列で、計算すると になる。固有値は 2 と 1 である。
特異値は と 1 で、どちらも 0 でないので階数は 2 である。3 行あっても、独立な向きは 2 つしかない。
第 1 列と第 3 列が同じ向きなので、その分が という長さに表れている。
対称行列では固有値の絶対値になる
対称行列なら、特異値は固有値の絶対値に一致する。スペクトル分解で と書けるので、負の固有値の符号を 側へ移せばよい。
正定値行列に限れば、特異値と固有値はそのまま同じものになる。符号を移す必要がないからである。
一般の行列では、特異値と固有値の間にこうした簡単な関係はない。特異値のほうが計算に強く、数値的にも安定している。
例:固有値が負の行列で確かめる
対称行列で、固有値は 3 と である。特異値はその絶対値を取って 3 と 1 になる。
を計算しても確かめられる。 の固有値は 9 と 1 で、平方根が 3 と 1 である。
符号の違いは に吸収される。特異値の側には現れない。
低ランク近似が最良になる
大きい特異値の項から順に 個だけ残すと、階数 の行列ができる。この行列が、階数 の中でもっともよい近似になる。
エッカート・ヤングの定理と呼ばれ、作用素ノルムでもフロベニウスノルムでも最良である。誤差の大きさまで分かる。
落とした特異値がそのまま誤差になる。どこで切るかを、特異値の大きさを見て決められる。
例:項を落として誤差を測る
例の行列で第 2 項を落とすと、階数 1 の行列 が残る。もとの行列との差は である。
この差の作用素ノルムは で、落とした特異値 と一致する。定理の主張どおりになっている。
が の 2 倍あるので、1 項だけでもおおよその形は残る。特異値の差が大きいほど、少ない項でよく近似できる。
ノルムと条件数へのつながり
作用素ノルムは最大の特異値に等しい。行列がベクトルをいちばん引き伸ばす倍率が、そのまま だからである。
フロベニウスノルムは、特異値の 2 乗和の平方根になる。成分の 2 乗和として計算しても同じ値になる。
条件数は最大と最小の特異値の比である。この値が大きいほど、連立方程式の解が誤差に敏感になる。くわしくは行列のノルムの記事で扱う。
応用
画像の圧縮では、画素の並びを行列と見て特異値分解する。大きい特異値の項だけを残せば、少ないデータで元の画像に近いものが作れる。
主成分分析でも同じ考え方を使う。データを並べた行列を分解し、大きい特異値の向きを主成分として取り出す。
検索や推薦の分野でも、大きな疎行列を低い階数で近似する手法として使われる。
他の話題とのつながり
疑似逆行列は、この分解から作れる。 の零でない対角成分を逆数に取り替えるだけで、最小二乗解を与える行列が得られる。
対称行列に限れば、スペクトル分解と同じ内容になる。両側の直交行列が一致する場合が、そちらにあたる。
分解や 分解と比べると、特異値分解は計算量が大きい。そのぶん階数や近似の情報まで取り出せる。













