特異値分解(SVD)と次元圧縮
データの「本当に重要な方向」を数値で取り出す万能の行列分解
- 1
- 特異値分解(SVD)は任意の行列 を という「回転 → 軸ごとの伸縮 → 回転」の3段階に分解する手法
- 2
- の対角成分(特異値)は大きい順に並び、最大の特異値に対応する方向がデータのばらつき(分散)が最も大きい方向を示す
- 3
- 上位いくつかの特異値・特異ベクトルだけを残して残りを捨てることで、情報損失を抑えながらデータを低次元に圧縮できる(画像圧縮・推薦システムの次元圧縮)
なぜこれを学ぶのか? — 現実社会とテクノロジーでの価値
なぜ生まれたのか?
特異値分解(SVD)は任意の行列 $A$ を $A = U\Sigma V^\top$ という「回転 → 軸ごとの伸縮 → 回転」の3段階に分解する手法
身につく武器・思考力
$\Sigma$ の対角成分(特異値)は大きい順に並び、最大の特異値に対応する方向がデータのばらつき(分散)が最も大きい方向を示す
実社会・ITでの活躍現場
- •画像圧縮とレコメンドシステムにおける低ランク近似
- •ITシステム・アルゴリズム実装における論理設計
- •データ分析やシミュレーションにおける数理モデリング
Layer 1 — 直感・シミュレーター
散布図として与えられた2次元の点群データに対し、回転スライダーで「射影軸」の角度を変えてみよう。軸を回転させると、その軸上に点を射影したときの広がり(分散)がリアルタイムに表示される。分散が最大になる角度こそが第1特異値の方向であり、直交するもう一方の軸に沿った情報は次元圧縮の際に真っ先に捨てられる成分であることが体感できる。
↑ 灰色の点群データに対し、青い軸(射影方向)を回転させてみよう。軸上の濃い青い点は、各データ点をその軸に射影した位置。分散が最大になる角度(約30°付近)が、この点群の第1特異値・第1特異ベクトルの方向であり、次元圧縮の際に「最も情報を保持する軸」として最初に選ばれる。
2次元の点群データにSVD(または主成分分析)を適用したとき、第1特異値に対応する方向はどのような性質を持つか?
Layer 2 — 定義・受験・証明
定義
任意の 実行列 は、直交行列 、対角行列 、直交行列 を用いて次のように分解できる(特異値分解)。
の対角成分 を「特異値」と呼び、 の列を「左特異ベクトル」、 の列を「右特異ベクトル」と呼ぶ。 個の特異値だけを残した近似 は、階数 の行列の中で に最もよく近似する(低ランク近似)。
公式・数理モデル
証明・導出
特異値と固有値の関係の導出: 対称行列 ()は半正定値であるため、固有値はすべて非負の実数であり、直交する固有ベクトル が存在する()。 この固有値の平方根を特異値と定義する:。 のとき、 とおくと、
より も正規直交系をなす。 このとき が成り立つので、、(不足分は直交補完)とすれば 、すなわち が得られる。 また、データ行列 の各行を中心化(平均0)しておけば、 は共分散行列に比例するため、右特異ベクトル は主成分分析(PCA)の第1主成分の方向と一致し、 はその方向の分散(の定数倍)を表す。
押さえておきたいポイント
- SVDは正方行列に限らず、任意の長方形行列に対して常に存在する(固有値分解より適用範囲が広い)
- 第1特異値・特異ベクトルの方向は、データを1次元に射影したときに情報損失(二乗誤差)を最小にする最適な軸である(エッカート・ヤングの定理)
- 上位 個の特異値だけを使う低ランク近似 は、階数 の行列の中でフロベニウスノルム誤差 を最小化する最良近似である
- 画像圧縮では画素行列にSVDを適用し上位特異値のみ保存、推薦システムでは評価行列(ユーザー×商品)にSVDを適用して潜在的な嗜好パターンを抽出する
本トピックの内容・数理モデルは、文部科学省学習指導要領(算数・数学・情報)および国際標準カリキュラムに準拠し、エンジニアリング現場の実装事例と照らし合わせてMath World Lab編集部により検証・作成されています。
Layer 3 — 工学応用・現場実装
画像圧縮とレコメンドシステムにおける低ランク近似
グレースケール画像は画素値の行列とみなせるため、SVDで分解して上位 個の特異値のみを保持することでデータ量を大幅に削減できる(画像圧縮)。同様に、ユーザーと商品の評価行列にSVDを適用すると、少数の「潜在因子」でユーザーの嗜好と商品の特徴を近似的に表現でき、協調フィルタリング型レコメンドの基礎となる。
1// 簡略化した低ランク近似(実際のSVDはヤコビ法やべき乗法などで計算するが、2// ここでは概念を示すため、既に得られたU, Σ, V^T から近似行列を再構成する例を示す)3type Matrix = number[][];45// 上位 k 個の特異値・特異ベクトルのみを使って行列を再構成する6function reconstructLowRank(7 U: Matrix, // m x r (左特異ベクトルを列に持つ)8 singularValues: number[], // 長さ r(降順にソート済み)9 V: Matrix, // n x r (右特異ベクトルを列に持つ)10 k: number // 保持する特異値の個数(圧縮率を決める)11): Matrix {12 const m = U.length;13 const n = V.length;14 const result: Matrix = Array.from({ length: m }, () => new Array(n).fill(0));1516 // A_k = Σ_{i=1}^{k} σ_i * u_i * v_i^T (階数kの近似)17 for (let i = 0; i < k; i++) {18 const sigma = singularValues[i];19 for (let row = 0; row < m; row++) {20 for (let col = 0; col < n; col++) {21 result[row][col] += sigma * U[row][i] * V[col][i];22 }23 }24 }25 return result;26}2728// 圧縮率の目安: 元のデータ量 m*n に対し、29// 階数kの近似に必要なデータ量は k*(m+n+1) 個の数値のみ30function compressionRatio(m: number, n: number, k: number): number {31 return (k * (m + n + 1)) / (m * n);32}3334console.log(compressionRatio(512, 512, 20)); // 例: 512x512画像を上位20成分で近似 → 約0.08(約8%のデータ量)
次に学ぶならコレ!おすすめトピック
この単元と深い繋がりを持つ、あわせて学ぶと理解が深まるおすすめ単元