Principal Component Analysis (PCA)
主成分分析(PCA)は、分散を最も多く捉える直交方向にデータを射影します。仕組み、kの選び方、用途、コードを解説します。
主成分分析(PCA)は線形の次元削減手法であり、データを主成分と呼ばれる新しい無相関の変数として再表現し、各変数が捉えるデータの分散量に応じて順序付けます。最初の少数の主成分だけを残すことで、情報の大部分を保持しながら、多数の相関する特徴量を少数に圧縮できます。Karl Pearsonが1901年にこの手法を導入し、Harold Hotellingが1933年に発展させて命名しました。PCAはラベルを無視する教師なし手法であり、標準的なデータ前処理の手順、高次元データを2次元または3次元で可視化する高速な方法、そして機械学習における圧縮やノイズ除去のベースラインとして使われます。
PCAの仕組み#
PCAではまず、各特徴量から平均値を引いて中心化します。第1主成分は、中心化されたデータが最も大きく変動する方向です。後続の各主成分は、先行するすべての主成分と直交し、残りの分散が最大になる方向です。主成分はデータの共分散行列の固有ベクトルであり、対応する固有値は各方向の分散です。ライブラリでは、共分散行列を直接作るより数値的に安定した、中心化データの特異値分解(SVD)を使って両方を計算します。データを上位k個の主成分に射影すると次元削減された表現が得られ、それを元に戻すと元データの近似が復元されます。k次元へのすべての線形射影の中で、PCAは二乗再構成誤差を最小にします。
分散は単位に依存するため、ドル建ての所得や年齢など、尺度の異なる特徴量は事前に標準化します。そうしないと、数値範囲が最も大きい特徴量が第1主成分を支配します。主成分数kは通常、寄与率に基づいて決めます。累積寄与率が95%などの目標に達するまで主成分を残す方法や、主成分ごとの分散を示すスクリープロットの折れ曲がり点を使う方法があります。
Scikit-learnのPCAでは、分散の目標値を直接指定できます。この例では、手書き数字の8×8画像を圧縮します。
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
# 1,797 handwritten digits, each an 8x8 image flattened to 64 pixel values
X, _ = load_digits(return_X_y=True)
# Keep the fewest components that explain 95% of the variance
pca = PCA(n_components=0.95)
X_reduced = pca.fit_transform(X)
print(f"{X.shape[1]} features -> {pca.n_components_} components")
print(f"First two components: {pca.explained_variance_ratio_[:2].sum():.1%} of the variance")64ピクセルの分散の95%を29個の主成分で保持できるため、入力サイズを半分以上削減できます。また、最初の2つの主成分だけで28.5%を保持します。隣接するピクセルには強い相関があり、画像の左右の端にあるピクセルはほとんど変化しないため、分散が集中します。
制限事項#
PCAは線形構造のみを捉えるため、曲面上に分布するデータでは、真の次元数より多くの成分が必要です。各成分には元のすべての特徴量が混在するため解釈が難しく、二乗距離の影響で一部の外れ値が成分の向きを左右することもあります。分散の大きさは有用性と同じではありません。分散の小さい方向に2つのクラスを分離するシグナルが含まれる場合もあり、失われる分散が少なくても、その方向を捨てると分類器の性能が低下する可能性があります。多数の特徴量を少数に減らすことは、特徴量が増えるほど汎化に必要なサンプル数が大幅に増える次元の呪いへの対処に役立ち、特徴量が多くサンプルが少ない場合の過学習も抑えられます。
コンピュータービジョンにおける埋め込みのPCA#
ビジョンモデルは各画像や物体を、数百個の数値からなるベクトルである埋め込みで表現します。PCAは、これらのベクトルをプロット、クラスタリング、圧縮する際によく使われる最初の手法です。YOLO26モデルはmodel.embed()を通じて画像ごとに1つの埋め込みを返し、そのベクトルを最初の2つの主成分に射影すると、カスタム学習済みモデルがクラスをどのように分離するかを線形に素早く可視化できます。保存した埋め込みをより少ない次元に削減すれば、ベクトルデータベースのインデックスが小さくなり、ベクトル検索も高速化します。
用途#
- 顔認識:TurkとPentland(1991)の固有顔法では、一連の顔画像の主成分上の座標で各顔を表現し、その座標を比較して人物を認識しました。
- 異常検知:産業プロセスの監視では、通常運転時のセンサーデータにPCAを適用し、新しい測定値の再構成精度が低い場合や、保持した成分上で大きく外れている場合にアラームを発します。
- 集団遺伝学:遺伝子型データに対するPCAは祖先集団を要約します。2008年に1,387人のヨーロッパ人を対象に行われた研究では、最初の2つの成分によってヨーロッパの地図として認識できる形が再現されました。
- 金利リスク:債券のイールドカーブの変化は、アナリストが水準、傾き、曲率と呼ぶ3つの成分に支配されるため、リスクモデルではすべての満期ではなく3つの数値を追跡します。
PCAと関連手法の比較#
- t-SNEとUMAP:可視化向けに設計された非線形手法で、局所的な近傍関係を保つためクラスターがより明確に分離しますが、離れたクラスター間の距離は意味を失います。Scikit-learnのt-SNEには新しい点を変換する機能がありませんが、学習済みのPCAなら1回の行列乗算で新しいデータを射影できます。
- オートエンコーダー:データを圧縮して再構成するニューラルネットワークで、非線形構造を学習できます。二乗誤差で学習した線形オートエンコーダーは、PCAと同じ部分空間を学習します。
- 特徴選択と特徴抽出:特徴選択では元の列の一部を保持するため解釈性が保たれます。一方、古典的な特徴抽出手法であるPCAは、すべての特徴量を組み合わせて新たな特徴量を作ります。
- 線形判別分析(LDA):教師あり学習による関連手法で、全体の分散ではなくクラス間の分離を最大化する方向を選び、クラス数より最大で1つ少ない成分を生成します。










