← 機械学習テキスト 一覧

🎓 レベル:標準 | 重要度:A(必須)

📎 前提:次元の呪い | 数理:主成分分析(PCA)(統計, 固有値分解の数理)・分散共分散行列・相関行列(統計)

要点(BLUF)

1. 次元削減とは・なぜ要るのか

次元削減は、dd 個の特徴量を、情報をなるべく保ったまま少数の k(<d)k\,(<d) 個に圧縮する操作です。動機は主に4つあります。

PCA はこのうち線形・教師なし・分散基準の代表選手です。「線形」とは、新しい軸が元の特徴量の一次結合(足し算と定数倍だけ)で書けるという意味です。

要するに:たくさんの軸を、情報の損が一番少ない少数の軸に取り替える。PCA はその軸を「分散が大きい順」に選びます。

2. データの中心化と共分散行列

PCA の前処理は**中心化(centering)**です。各特徴量から平均を引き、各列の平均を 0 にします。nn 個・dd 次元のデータを行に並べた行列を XRn×dX\in\mathbb{R}^{n\times d}(既に中心化済み)とすると、共分散行列

S=1nXXRd×dS = \frac{1}{n} X^\top X \in \mathbb{R}^{d\times d}

です。SS の対角成分が各特徴量の分散、非対角成分が特徴量間の共分散。SS対称・半正定値なので、固有値はすべて実数かつ非負、固有ベクトルは直交に取れます——これが後で効きます。

中心化が必須なのは、XXX^\top X が「原点まわりの二次モーメント」であって、平均を引かないと分散ではなくなるからです。平均を引いて初めて 1nXX\frac{1}{n}X^\top X が共分散になります。

要するに:まず平均を引いて原点を重心に合わせ、特徴量どうしの「一緒に動く度合い」を SS にまとめます。

3. 定式化(その1):分散最大化

第1主成分 w1w_1 は「この向きに射影したとき、射影点の分散が最大になる単位ベクトル」です。データ点 xix_i を方向 www=1\lVert w\rVert=1)に射影したスカラーは wxiw^\top x_i。中心化済みなのでその分散は

1ni=1n(wxi)2=w ⁣(1nXX) ⁣w=wSw.\frac{1}{n}\sum_{i=1}^n (w^\top x_i)^2 = w^\top\!\left(\frac{1}{n}X^\top X\right)\! w = w^\top S w .

よって第1主成分は次の制約付き最大化の解です。

w1=argmaxw=1  wSw.w_1 = \arg\max_{\lVert w\rVert = 1} \; w^\top S w .

ラグランジュ未定乗数法 → 固有値問題

制約 w2=ww=1\lVert w\rVert^2 = w^\top w = 1 をラグランジュ乗数 λ\lambda で組み込みます。

L(w,λ)=wSwλ(ww1).\mathcal{L}(w,\lambda) = w^\top S w - \lambda\,(w^\top w - 1).

ww で微分して 0 と置くと(SS は対称なので (wSw)/w=2Sw\partial (w^\top S w)/\partial w = 2Sw)、

Lw=2Sw2λw=0Sw=λw.\frac{\partial \mathcal{L}}{\partial w} = 2 S w - 2\lambda w = 0 \quad\Longrightarrow\quad \boxed{\,S w = \lambda w\,}.

つまり ww は**SS の固有ベクトル**、λ\lambda はその固有値でなければなりません。さらにこの ww での目的関数値は

wSw=w(λw)=λ(ww)=λw^\top S w = w^\top (\lambda w) = \lambda\,(w^\top w) = \lambda

なので、射影後の分散はちょうど固有値 λ\lambda に等しい。分散を最大にしたいので、選ぶべきは最大固有値 λ1\lambda_1 に対応する固有ベクトルです。これが第1主成分 w1w_1 で、その分散は λ1\lambda_1

第2主成分は「w1w_1 と直交する」制約を追加して同じ最大化を解くと、2番目に大きい固有値 λ2\lambda_2 の固有ベクトルになります。以下同様で、主成分 = 固有値の大きい順に並べた固有ベクトル、各主成分の分散 = その固有値です。固有値分解そのものの数理(対称行列の固有値が実数になる理由など)は 主成分分析(PCA)(統計)に譲ります。

要するに:分散最大化を真面目に解くと、自動的に「共分散行列の固有ベクトルを固有値の大きい順に取れ」という答えが出ます。固有値がそのまま「その軸が説明する分散の量」です。

4. 定式化(その2):再構成誤差最小化、そして双対性

PCA にはもう1つの顔があります。「上位 kk 本の軸だけで元データを近似したとき、近似の誤差(再構成誤差)を最小にする部分空間を選べ」という見方です。実はこれが3節と同じ問題であることを示します。これが PCA の双対性(duality)です。

正規直交な kk 本の方向を列に持つ Wk=[w1,,wk]Rd×kW_k = [w_1,\dots,w_k]\in\mathbb{R}^{d\times k}WkWk=IkW_k^\top W_k = I_k)を取ります。点 xix_i をこの部分空間に射影して戻した再構成は x^i=WkWkxi\hat{x}_i = W_k W_k^\top x_i。最小化したいのは平均二乗の再構成誤差

J(Wk)=1ni=1nxiWkWkxi2.J(W_k) = \frac{1}{n}\sum_{i=1}^n \bigl\lVert x_i - W_k W_k^\top x_i \bigr\rVert^2 .

トレースによる分解

P=WkWkP = W_k W_k^\top は射影行列で PP=PP^\top P = P、かつ xPx2=xxxPx\lVert x - Px\rVert^2 = x^\top x - x^\top P x が成り立ちます(直交射影なのでピタゴラスの定理そのもの)。これを代入し、1nixixi=S\frac{1}{n}\sum_i x_i x_i^\top = S を使うと

J(Wk)=tr(S)全分散(定数)tr(WkSWk)射影後の分散.J(W_k) = \underbrace{\operatorname{tr}(S)}_{\text{全分散(定数)}} - \underbrace{\operatorname{tr}(W_k^\top S W_k)}_{\text{射影後の分散}} .

第1項 tr(S)=jλj\operatorname{tr}(S) = \sum_j \lambda_jWkW_k に依らない全分散の定数です。したがって

minWkJ(Wk)    maxWktr(WkSWk).\min_{W_k} J(W_k) \;\Longleftrightarrow\; \max_{W_k} \operatorname{tr}(W_k^\top S W_k).

右辺は「射影後の分散の合計を最大化せよ」——まさに3節の多次元版です。**全分散 = 射影後に残る分散 + 失う分散(再構成誤差)**という恒等式なので、片方を最大化すれば自動的にもう片方が最小化されます。

graph LR
    Total["全分散 tr(S) = Σλ (一定)"] --> Keep["残す分散 = tr(W^T S W) (最大化したい)"]
    Total --> Lost["失う分散 = 再構成誤差 J(W) (最小化したい)"]
    Keep -. "和は常に一定なので一方を上げれば他方が下がる(双対)" .- Lost

要するに:「一番よく説明する向き」を選ぶのと「一番情報を捨てない向き」を選ぶのは、同じコインの裏表です。全分散が一定だから、残す分散を最大化=失う分散を最小化、になります。

5. SVD:実装ではこちらを使う

理論は共分散行列 SS の固有値分解ですが、実装では SS を作らずに XX を直接 SVD します。中心化済み XX の特異値分解は

X=UΣV,URn×n,    ΣRn×d,    VRd×dX = U \Sigma V^\top,\qquad U\in\mathbb{R}^{n\times n},\;\; \Sigma\in\mathbb{R}^{n\times d},\;\; V\in\mathbb{R}^{d\times d}

で、U,VU,V は直交、Σ\Sigma は対角に特異値 σ1σ20\sigma_1\ge\sigma_2\ge\cdots\ge 0 を並べたものです。ここで

S=1nXX=1nVΣUUΣV=V ⁣(ΣΣn) ⁣V.S = \frac{1}{n}X^\top X = \frac{1}{n}V\Sigma^\top U^\top U \Sigma V^\top = V\!\left(\frac{\Sigma^\top\Sigma}{n}\right)\!V^\top .

これは SS の固有値分解そのものです。つまり

なぜ SS を経由しないか。XXX^\top X を作ると条件数が二乗されて数値的に不安定になり、メモリも d×dd\times d 必要です。SVD は XX から直接、より安定に同じ答えを出します。scikit-learn の PCA も内部は SVD です。

要するに:PCA = 共分散行列の固有値分解、ですが計算は SVD で代用するのが定番。VV が主成分、特異値の二乗 /n/n が分散です。

6. 寄与率と次元の選び方

主成分 jj が説明する分散は λj\lambda_j、全分散は jλj\sum_j \lambda_j。そこで

寄与率(第 j 主成分)=λjl=1dλl,累積寄与率(上位 k=j=1kλjl=1dλl\text{寄与率(第 $j$ 主成分)} = \frac{\lambda_j}{\sum_{l=1}^{d}\lambda_l},\qquad \text{累積寄与率(上位 $k$)} = \frac{\sum_{j=1}^{k}\lambda_j}{\sum_{l=1}^{d}\lambda_l}

と定義します。寄与率は「その軸が全情報の何割を担うか」。kk の選び方の定番は2つです。

flowchart LR
    A["データ X"] --> B["中心化(列平均を引く)"]
    B --> C["SVD:X = U Σ Vᵀ(または S = X^T X / n の固有値分解)"]
    C --> D["固有値 λ を降順に並べる"]
    D --> E["寄与率・累積寄与率を計算"]
    E --> F["スクリープロットの肘 or 累積寄与率しきい値で k を決定"]
    F --> G["上位 k 本へ射影:得点 = X·V_k"]

注意点として、スクリープロットの肘は主観的です。曲線が滑らかだと肘がはっきりせず、複数の肘が見えることもあります。下流タスク(分類・回帰)がある場合は、累積寄与率より交差検証で kk を選ぶほうが堅実です。

要するに:固有値の大きさ=その軸の重要度。累積で十分な割合を確保できる最小の kk、または折れ線の肘で次元を決めます。

7. 白色化(whitening)

主成分得点を、各軸が分散1・互いに無相関になるよう正規化する操作を**白色化(whitening / sphering)**と呼びます。第 jj 主成分の得点を λj\sqrt{\lambda_j} で割るだけです。これで共分散行列が単位行列になり、データが等方的(どの向きも同じ広がり)になります。

なぜ要るか。下流のモデルが各方向を対等に扱ってほしいとき(例:距離ベースの手法、一部のニューラルネット入力)に効きます。ただし小さい固有値で割るとノイズを増幅しやすいので、λj\lambda_j が極端に小さい軸を切ってから行うのが安全です。

8. ML文脈での使いどころと限界

使いどころ

限界(前提が崩れると効かない)

要するに:PCA は「線形・分散基準・教師なし」の枠の中で最強クラスですが、その枠の外(非線形・クラス分離・小分散に潜む情報)には届きません。目的に合うかを毎回確認します。

⚠️ よくある誤解・落とし穴

対応するシミュレーション

simulations/pca_variance.py:相関のある2次元データで、射影方向を 00180°180° まで回しながら射影後の分散再構成誤差を測ります。分散が最大になる角度と再構成誤差が最小になる角度がぴったり一致し、それが共分散行列の第1固有ベクトルの方向に一致することを数値・グラフで確認できます(「全分散=射影分散+再構成誤差」というトレース恒等式の実証)。

分散最大の方向=再構成誤差最小の方向=第1固有ベクトル

関連ノート


Sources(DeepResearch で横断した主な情報源):