メインコンテンツへスキップ

特異値分解(SVD):知っておくべきこと

特異値分解(SVD)は、任意の行列を3つのより単純な成分に分解し、その背後にある構造を明らかにする行列因子分解手法です。
更新 2026年5月22日  · 12 分 読む

AIで探索

ChatGPTで開くClaudeで開くPerplexityで開く

何千もの特徴量を持つデータセットから、有用なパターンを抽出しようとしたことはありますか?

巨大なデータセットには、有用な構造がどこかに埋もれているはずです。問題は、生のデータにはノイズや冗長性、欠損値が多く、実際に必要とする以上の次元を含んでいることです。多くの機械学習アルゴリズムは、そのようなデータをうまく扱えず、せいぜい学習が遅くなる程度でしょう。

特異値分解(SVD)は、任意の行列(この場合はデータセット)を、その中核となる構造を示す3つのより単純な行列に分解します。これはレコメンデーションシステム、画像圧縮、PCAのような次元削減手法の背後にある数学で、一度理解すれば、日々の業務のいたるところで目にするはずです。

本記事では、SVDとは何か、その仕組み、データサイエンスでの用途、そして代替手法を選ぶべき場面について解説します。

ベクトルや行列式といった概念が難しく感じますか?この続きを読む前に、ディープラーニングのための数学概念をやさしく解説の記事をご覧ください。

特異値分解(SVD)とは?

SVDは、任意の行列を3つのより単純な行列に分解する手法です。

こう考えてみてください。行列 A を持っているとします。これはデータセットでも画像でもかまいません。SVDは A を次の3つに分けます:

SVD formula

SVD の式

  • Um x m の直交行列です。列は左特異ベクトルと呼ばれ、A の行同士の関係を表します。

  • \Sigmam x n の対角行列です。対角成分は特異値で、必ず非負で、大きい順に並んでいます。

  • V* は、n x n の直交行列の共役転置です。その行は右特異ベクトルと呼ばれ、A の列同士の関係を表します。

それぞれの成分は元のデータの異なる側面を示します。U は行レベルのパターン(行同士の関係)を、\Sigma は重要度(各パターンがどれだけ寄与するか)を、V* は列レベルのパターン(列同士の関係)を保持します。

たとえ話をしましょう。誰かにレシピを説明するなら、材料(何を使うか)、分量(どれだけ使うか)、手順(どう組み合わせるか)の3つに分けられます。どれか1つだけでは料理は再現できませんが、3つが揃えば必要な情報はすべて手に入ります。SVDは行列に対して同じことを行います——「何を」「どれだけ」「どうやって」を独立した要素に分け、個別に扱えるようにするのです。

SVDが線形代数で際立っているのは、どんな行列にも適用できる点です。正方行列である必要も、特別な性質を満たす必要もありません。任意の m x n 行列をこの方法で分解できるため、データサイエンスのあらゆる場面に登場します。

SVDの実践的な動き

SVDがどのように機能するかを、基本から順に見ていきましょう。

行列分解の説明

3×2 の行列 A があるとします:

Matrix decomposition

行列分解

SVDはこれを U(3×3)、\Sigma(3×2)、V*(2×2)に分解します。U の列は A x A^T の固有ベクトルから、V の列は A^T x A の固有ベクトルから得られます。\Sigma の特異値は、どちらの積に対しても固有値の平方根です。

ありがたいことに、これらを手計算する必要はありません。Pythonなら、次の1行で済みます:

import numpy as np

A = np.array([[1, 2], [3, 4], [5, 6]])
U, sigma, Vt = np.linalg.svd(A, full_matrices=True)

Numpy output

Numpy の出力

3つの行列は積を通じて相互作用します。U は行空間でデータを回転させ、\Sigma は各軸に沿ってスケーリングし、V* は列空間で回転させます。その結果が元の行列 A です。

特異値の役割

対角行列 \Sigma の値は、各成分が全体の行列にどれだけ寄与するかを示します。

最初の特異値は常に最大で、データの最も支配的なパターンを捉えます。以降の値は徐々に小さくなります。最初の数個が大きく、残りがほぼゼロに近いなら、行列の情報のほとんどが少数の成分に凝縮されていることを意味します。

これがデータ圧縮を可能にする理由です。

小さな特異値(およびそれに対応する U の列と V* の行)は、ほとんど情報を失わずに除外できます。結果として、元の行列の低ランク近似が得られ、サイズが小さく、扱いやすくなります。

零でない特異値の数は行列のランク(一次独立な行または列の本数)も示します。例えば 100×50 の行列に非零特異値が10個しかなければ、データは実質的に10次元の独立成分しか持たず、残りの40は冗長ということです。

行列の再構成

3つの成分を再び掛け合わせれば、元の行列を再構成できます:

Matrix reconstruction

行列の再構成

しかし、実際に欲しいのは部分再構成です。つまり、すべての特異値を使うのではなく、上位 k 個とそれに対応するベクトルだけを残します。これにより、ランク k の近似A に対して得られます:

Rank-k matrix approximation

ランク k の行列近似

Eckart-Young の定理は、このランク k 近似が、元の A に最も近いランク k の行列であること(フロベニウスノルムで測定)を保証します。言い換えると、行列を k 次元に圧縮するなら、SVDが最良の結果を与えるということです。

データサイエンスにおけるSVDの用途

意外に思うほど、SVDはさまざまな場面に現れます。

基本の考え方は常に、大きな行列から重要な部分だけを残し、残りを取り除くことです。何が「重要」かは問題によって異なります。

次元削減

高次元のデータセットは扱いにくく、解釈も難しいものです。特徴量が多いほど学習に時間がかかり、過学習のリスクも高まります。SVDは次元数を減らすことでこれを防ぎます。

大まかな流れはこうです。データ行列を分解し、特異値を見て、上位 k 個の成分だけを残します。小さな特異値はノイズや微小な変動を表すため、それらを取り除いてもデータ品質への影響はごくわずかです。結果として、元の構造の大部分を保持したコンパクトな表現が得られます。

これはまさに主成分分析(PCA)の仕組みです。PCAはデータを中心化し、その結果に対してSVDを実行します。主成分は右特異ベクトルであり、特異値は各成分がどれだけ分散を説明するかを示します。

レコメンデーションシステム

Netflix や Amazon のような企業は、ほとんどの要素が空の巨大なユーザー×アイテム行列を扱っています。ユーザーは何千本もの映画のうち数本しか評価しないため、行列は疎です。SVDはこの空白を埋めるために使われます。

考え方は、評価行列をユーザーの嗜好とアイテムの特性に分解することです。U は各ユーザーが重視する要素(ジャンル、テンポ、トーンなど)を表し、V* は各アイテムが提供する要素を表します。\Sigma の特異値は、これらの要素を重要度でスケーリングします。3つを掛け合わせれば、未視聴の映画に対する予測評価が得られます。

実務では、標準的なSVDは疎行列に直接は使えません。欠損値をゼロとして扱ってしまうからです。そのため、切断SVD(truncated SVD)や、観測された要素のみに作用する行列因子分解のような変種が使われます。

画像圧縮

グレースケール画像は、画素値の行列にすぎません。SVDは最も重要な特異値だけを残すことで圧縮できます。

1000×1000 の画像があるとします。完全なSVDでは特異値は1000個得られますが、上位50個だけを残せば、1000ではなく50個の成分で画像を再構成できます。画像はややぼやけますが判別可能で、保存する値の総数は 1,000,000 から約 100,500(U の50列 + 特異値50個 + V* の50行)に減ります。

より多くの特異値を残せば画質は向上しますが圧縮率は下がります。少なければファイルは小さくなりますが損失が増えます。用途に応じて、そのバランスを選べます。

性能面の考慮事項と制約

行列が大きくなるほど、計算コストは増大します。

計算コスト

m x n 行列の完全なSVDは、時間計算量が O(mn²)m >= n と仮定)です。小さな行列なら問題ありませんが、行数が数百万、列数が数千ともなれば高コストです。

メモリもボトルネックになります。完全なSVDは3つの密行列を生成するため、同時に保持するとRAMを超えることがあります。

対策は、不要な場合に完全なSVDを計算しないことです。切断SVDは、上位 k 個の特異値とそのベクトルだけを計算し、はるかに高速です。Pythonでは、scipy.sparse.linalg.svdssklearn.decomposition.TruncatedSVD がこれを提供します。ランダム化SVDはさらに一歩進み、ランダムサンプリングで分解を近似し、支配的な成分だけが必要な場合に有効です。

安定性と精度

SVDは多くの場合で数値的に安定ですが、データのパターンによっては苦手もあります。

強いノイズがある場合がその一例です。信号対雑音比が低いと、上位の特異値がノイズから分離しません。切断してもノイズを保持してしまったり、逆に信号を削ってしまったりします。

条件の悪い行列も問題です。最大特異値と最小特異値の比(条件数)が非常に大きいと、計算時の微小な数値誤差が増幅されます。浮動小数点精度の制限も相まって、信頼できない結果を生むことがあります。

対策は、切断する前に特異値を検査することです。プロットして、信号とノイズの間に明確な落ち込みがあるかを確認します。減衰が緩やかで明確な「肘」がなければ、そのデータセットにSVDは最適でない可能性があります。

SVDの代替手法

SVD以外にも行列分解はあり、常に最適というわけではありません。

以下で挙げる各手法は、特定の種類の問題を解きます。SVDの代替というより、前提や制約が異なる別の道具です。適切な選択は、常に目的のタスクに依存します。

固有分解

固有分解はSVDに最も近い手法です。正方行列を固有値と固有ベクトルに分解します:

Eigendecomposition formula

固有分解の式

ここで Q は固有ベクトルを、\Lambda は固有値の対角行列です。

弱点は、正方行列にしか適用できないことです。データ行列が m x nm != n の場合、固有分解は直接は使えません。SVDは任意の形状の行列で機能するため、より一般的な道具です。

対称な正方行列(共分散行列など)では、固有分解とSVDは密接に関連した結果を与えます。対称正定値半定行列の特異値はその固有値です。したがって、PCAで共分散行列を扱う場合、どちらを使っても同じ結果が得られます。SVDは非正方の場合にも一般化できる版だといえます。

QR分解

QR分解は、行列を直交行列 Q と上三角行列 R に分けます:

QR decomposition formula

QR分解の式

特に連立一次方程式や最小二乗問題の解法では、SVDより高速な場合があります。

その代償は情報量です。QRは特異値を与えないため、行列のランクやどの成分が重みを多く持つかを教えてくれません。Ax = b を解くだけで基礎構造に関心がないならQRが良い選択ですが、データの理解や圧縮が目的ならSVDが適しています。

非負値行列因子分解(NMF)

NMFは、すべての値が非負の2つの行列に分解します:

NMF formula

NMF の式

この制約により、ピクセルの強度や単語数のように本質的に非負なデータに適しています。一方、SVDにはそのような制約がなく、分解後の行列は負の値を含むことがあり、成分の解釈が難しくなることがあります。

NMFはテキストマイニングやトピックモデルで特に人気です。W の各列はトピックを、H の各行は各ドキュメントにそのトピックがどれだけ現れるかを表せます。非負制約により、トピックは単語の加法的な組み合わせとして構築され、SVDの正負が混在する成分に比べて読みやすくなります。

欠点は、NMFは解の一意性を保証せず、初期値に結果が依存することです。SVDは同じ入力に対して常に同じ出力を返します。

ランダム化SVD

行列が大きすぎて完全なSVDが難しいが、特異値は欲しい——その場合はランダム化SVDが有力です。ランダム射影を用いて、完全分解を行わずに上位 k 個の特異値と特異ベクトルを近似します。scikit-learnTruncatedSVD)やFacebookの fbpca といったライブラリがこの手法を実装しており、行数が数百万の行列にもスケールします。

以下の表は、各手法を選ぶべき場面のまとめです。

Alternatives to SVD

SVDの代替手法

SVDで気をつけたいその他の点

新人のデータサイエンティストがよく混乱する点がいくつかあります。

1つ目は、特異値の読み違いです。大きな特異値は、その成分がデータの分散を多く説明していることを意味しますが、領域固有の意味で「重要」であることを意味しません。例えば、ユーザー評価行列の支配的な特異値は、「多くの人が人気映画を評価する」という事実を捉えているだけかもしれません。特異値は大きさだけでなく、データの文脈で解釈してください。

2つ目は、必要ないのにSVDに頼ることです。行数が数百、列が数個といった小さなデータセットでは、SVDは不必要に複雑になります。相関分析や基本的な特徴選択のような単純な手法のほうが、より速く、少ないコードで目的を達成できます。SVDが威力を発揮するのは、冗長な構造を持つ高次元データです——それに当てはまらないなら、より単純な手法を使いましょう。

まとめ

SVDは任意の行列を、その構造を示す3つの成分に分解します。特異値はデータのどの部分が最も重要かを示し、左右の特異ベクトルはそれらの背後にある行・列のパターンを示します。

この分解は、日々使う多くの実用的なツールの基盤です。レコメンデーションシステムは、未観測の評価を予測するためにこれを用い、画像圧縮は視覚品質を保ちながらファイルサイズを減らすために用います。分野は違っても、その背後の数学はほぼ同じです。

ただし、SVDが常に最適な道具とは限りません。巨大な行列では計算コストが高く、特異値が明確に分離しない場合は信号とノイズが混ざることもあります。小さなデータセットには過剰です。QR分解、固有分解、NMFといった代替手法は、それぞれ特定のケースでより適しています。

重要なのは、SVDを使うべき場面と、より単純な方法のほうが適する場面を見極めることです。その力を身につけるには、Machine Learning Scientist in Python トラックに登録して、2026年に即戦力を目指してください。

SVD に関するFAQ

特異値分解(SVD)とは何ですか?

SVDは任意の行列を3つの成分に分解する行列分解手法です。左特異ベクトル(U)、特異値(Σ)、右特異ベクトル(V*)からなり、形状や大きさに関わらずどんな行列にも適用できます。SVDはデータをパターンとその相対的重要度に分けることで、背後にある構造を明らかにします。

なぜデータサイエンスや機械学習でSVDが使われるのですか?

SVDは、高次元データセットの次元数を減らしつつ、最も重要なパターンを保持するのに役立ちます。PCAやレコメンデーションシステムの背後にある数学でもあります。いずれの応用でも、支配的な成分を残し、残りを取り除くという同じ発想に基づいています。

SVDと固有分解の違いは何ですか?

固有分解は正方行列にしか適用できませんが、SVDは任意の形状の行列に適用できます。共分散行列のような正方対称行列では、両者は密接に関連した結果を生みます——正定値半定行列の特異値はその固有値です。SVDはより一般的な道具であり、多くのデータサイエンスのワークフローで標準となっているのはこのためです。

特異値はデータ圧縮とどう関係しますか?

特異値は大きい順に並んでおり、それぞれが特定の成分がどれだけ分散を説明するかを表します。小さな特異値(と対応するベクトル)を削除すると、主要な構造を保ったまま、細かなパターンやノイズを取り除けます。サイズを大幅に削減する代わりに、精度のわずかな低下を受け入れることになります。

SVDの使用を避けるべきタイミングは?

SVDは大規模行列では高コストで、完全分解の時間計算量は O(mn^2) です。特徴量が数個の小さなデータセットなら、相関分析や基本的な特徴選択などの単純な手法の方が速く済みます。行列が非常に大きく、上位成分だけが必要な場合は、完全なSVDよりも切断SVDやランダム化SVDが適しています。

トピック

DataCamp で学ぶ

Courses

Python で学ぶ線形分類器

4時間
66.6K
このコースでは、logistic regression や SVM などの線形分類器の詳細を学びます。
詳細を見るRight Arrow
コースを開始
もっと見るRight Arrow