📖

主成分分析の証明

に公開

PCAの導出

主成分分析(PCA, Principal Component Analysis)は、高次元のデータを低次元に射影し、データの分散が最大となる軸(主成分)を見つける手法。


🔷 目標

  • 与えられたデータの**分散が最大となる方向(ベクトル)**を見つけたい。
  • これは、データの射影先の分散を最大化するという最適化問題に帰着されます。

🔶 前提と記号

  • データ行列 X \in \mathbb{R}^{n \times d}n 個のサンプル、d 次元。

  • 平均を 0 にした(センタリング済み)と仮定:

    \sum_{i=1}^{n} \mathbf{x}_i = 0
  • 共分散行列:

    \Sigma = \frac{1}{n} X^\top X

🔷 Step 1: 主成分とは何か?

主成分は、データの分散が最大になる方向ベクトル \mathbf{w} を求めること。

問題設定:

  • \mathbf{w} \in \mathbb{R}^d:射影先の方向(単位ベクトル: \| \mathbf{w} \| = 1

  • 各サンプルを \mathbf{w} に射影したときのスカラー値:

    z_i = \mathbf{w}^\top \mathbf{x}_i
  • このとき、射影されたデータの分散は:

    \text{Var}(z) = \frac{1}{n} \sum_{i=1}^{n} (\mathbf{w}^\top \mathbf{x}_i)^2 = \mathbf{w}^\top \left( \frac{1}{n} \sum_{i=1}^{n} \mathbf{x}_i \mathbf{x}_i^\top \right) \mathbf{w} = \mathbf{w}^\top \Sigma \mathbf{w}

🔷 Step 2: 最適化問題の定式化

最大化問題として定式化:

\text{maximize}_{\mathbf{w}} \quad \mathbf{w}^\top \Sigma \mathbf{w} \quad \text{subject to} \quad \| \mathbf{w} \| = 1

🔷 Step 3: ラグランジュの未定乗数法

制約付き最適化をラグランジュ関数で書く:

L(\mathbf{w}, \lambda) = \mathbf{w}^\top \Sigma \mathbf{w} - \lambda (\mathbf{w}^\top \mathbf{w} - 1)

勾配をゼロにする:

\nabla_{\mathbf{w}} L = 2\Sigma \mathbf{w} - 2\lambda \mathbf{w} = 0 \Rightarrow \Sigma \mathbf{w} = \lambda \mathbf{w}

これは、\Sigma の固有値問題になっている!


🔷 Step 4: 結論と幾何的意味

  • \mathbf{w}:共分散行列 \Sigma固有ベクトル
  • \lambda:対応する固有値
  • \mathbf{w}^\top \Sigma \mathbf{w} = \lambda は、射影後の分散を表す
  • よって、最も分散が大きい方向(第1主成分)は、最大の固有値に対応する固有ベクトル

🔷 Step 5: 複数主成分の導出

第2主成分以降も同様だが、「前の主成分と直交する」という制約が加わる:

  • \mathbf{w}_2\mathbf{w}_1 に直交し、かつ \mathbf{w}_2^\top \Sigma \mathbf{w}_2 を最大化
  • よって、主成分は互いに直交する固有ベクトルの集合として得られる

🔷 Step 6: 射影と次元削減

  • 主成分ベクトルを列に持つ行列 W_k \in \mathbb{R}^{d \times k}

  • 元データ X を射影すると:

    Z = X W_k \in \mathbb{R}^{n \times k}
  • Z が次元削減されたデータ(PCAの結果)


✅ まとめ

項目 内容
目的 分散が最大となる方向へデータを射影する
主成分 共分散行列の固有ベクトル
分散 固有値に一致
PCAとは 共分散行列の固有値分解による基底変換

もちろんです。ここでは、PCAをSVD(特異値分解)で導出する方法を詳しく解説します。
これはPCAのもう一つの視点であり、固有値分解を使わずに主成分を求めることができる実用的な手法です。


🔷 概要:PCAとSVDの関係

  • PCAの目標:分散が最大になる軸にデータを射影する
  • 固有値分解で行う方法とは別に、SVDを使えば安定かつ効率的に主成分を求められる
  • 特に、実装上はnumpy.linalg.svdなどで行うことが多い

🔶 SVDとは何か?

任意の行列 X \in \mathbb{R}^{n \times d} は以下のように分解できる:

X = U \Sigma V^\top
  • U \in \mathbb{R}^{n \times n}:左特異ベクトル(直交行列)
  • \Sigma \in \mathbb{R}^{n \times d}:特異値(対角行列)
  • V \in \mathbb{R}^{d \times d}:右特異ベクトル(直交行列)

🔷 Step 1: データ行列の準備

  • データ行列 X \in \mathbb{R}^{n \times d}
  • 各列(特徴量)を平均 0 にセンタリングする(重要!)

🔷 Step 2: 共分散行列をSVDで見てみる

共分散行列は:

\Sigma_X = \frac{1}{n} X^\top X

ここで X = U \Sigma V^\top を代入すると:

\Sigma_X = \frac{1}{n} (V \Sigma^\top U^\top)(U \Sigma V^\top) = \frac{1}{n} V \Sigma^\top \Sigma V^\top

ただし、\Sigma^\top \Sigma特異値の二乗の対角行列
よって:

\Sigma_X = V \left( \frac{1}{n} \Sigma^\top \Sigma \right) V^\top

これが固有値分解の形と一致:

  • V:固有ベクトル(= 主成分方向)
  • \frac{1}{n} \Sigma^\top \Sigma:対応する固有値(= 分散)

🔷 Step 3: 射影と次元削減

  • 上位 k 個の右特異ベクトル(列ベクトル)を取り出し、行列 V_k \in \mathbb{R}^{d \times k} を作る

  • データを主成分に射影:

    Z = X V_k \in \mathbb{R}^{n \times k}

    これが低次元空間の表現(PCA後のデータ)


✅ メリット:なぜSVDを使うのか?

理由 内容
数値安定性 共分散行列を計算せずに済むため、高次元データでも安定
実装の容易さ numpy.linalg.svd(X) だけでOK(共分散行列不要)
次元削減に直接使える 特異値と特異ベクトルを使えば、すぐに射影が可能
アルゴリズム的に、Xを直接分解するため次元が抑えられて嬉しい。
数式的には実感しにくい...

🔧 実装例(Python)

import numpy as np

# データ行列 X(n×d)を平均0にセンタリング
X_centered = X - np.mean(X, axis=0)

# SVD分解
U, S, Vt = np.linalg.svd(X_centered, full_matrices=False)

# 主成分(右特異ベクトル)
V = Vt.T  # Vt は V の転置

# 上位 k 次元に削減
k = 2
Z = X_centered @ V[:, :k]

✅ まとめ:PCAとSVDの対応

PCAの概念 SVDでの対応
主成分方向 右特異ベクトル V
分散の大きさ 特異値の2乗 \sigma_i^2
射影後データ X V_k
共分散行列の固有分解 \Sigma_X = V \Lambda V^\top に一致

Discussion