← 機械学習テキスト 一覧

🎓 レベル:発展 | 重要度:B(標準)

📎 前提:主成分分析と次元削減 | 関連:サポートベクターマシン(SVM)(カーネルトリック)

要点(BLUF)

1. なぜ線形PCAでは足りないのか

主成分分析と次元削減のPCAは、データを直線(多次元なら超平面)に射影して分散最大の方向を取り出す手法でした。これは「データがおおむね平らな低次元部分空間に乗っている」ときは完璧に効きます。

問題は、現実の高次元データがしばしば曲がった面の上に乗っていることです。教科書的な例が**スイスロール(Swiss roll)**です。3次元空間の中で2次元の紙をくるくる巻いた形をしていて、「本当は2次元」なのに、ユークリッド距離で測ると巻きの内側と外側が近くに見えてしまいます。

graph LR
    A["スイスロール<br/>3次元に巻かれた2次元の面"] -->|"線形PCA: 平面に潰す"| B["巻きが重なって<br/>近傍がぐちゃぐちゃ"]
    A -->|"非線形次元削減: ほどく"| C["きれいな2次元<br/>近傍関係が保たれる"]

線形PCAでこれを2次元に落とすと、面を「巻いたまま真上から潰す」ことになり、本来遠い点(巻きの何周も先)と近い点(すぐ隣)が混ざります。ユークリッド距離という直線の物差しが、曲がった面の上では正しい近さを測れない——これが線形手法の限界の本質です。

要するに:PCAは「平らな構造」専用。曲がった構造をほどくには、直線以外の物差しが要ります。

2. 多様体仮説(manifold hypothesis)

非線形次元削減すべてに共通する前提が多様体仮説です。

高次元データは、見かけの次元(ピクセル数・特徴数)よりずっと低次元な多様体(manifold)の近傍に集中して乗っている。

多様体とは、ざっくり言えば「局所的には平らな(ユークリッド的な)、曲がった面・曲線」のこと。地球の表面(2次元の球面)が3次元空間に埋め込まれているのと同じイメージです。たとえば「同じ顔をいろんな角度・照明で撮った画像」は、ピクセル数としては数万次元でも、実質的に動かしているパラメータは「角度・照明」など数個。だからデータは数万次元空間の中の数次元の多様体に張り付いている、と考えます。

この仮説が効く理由は次元の呪いと表裏です。高次元空間はスカスカで何でもできそうに見えますが、意味のあるデータはごく薄い低次元の層にしか存在しない。だから「その層(多様体)の中での近さ」さえ復元できれば、低次元で十分に表現できる、というわけです。

非線形次元削減の手法はどれも「多様体に沿った近さ(測地距離・近傍グラフ・近傍確率)を保つように低次元へ落とす」という方針を共有しています。違いはその「近さ」をどう定義するかです。

3. カーネルPCA

着想:特徴空間でPCAをする

カーネルPCAの発想はシンプルです。「曲がった構造は、いったん高次元の特徴空間 ϕ(x)\phi(\mathbf{x}) に写してから見れば、平らに見えるかもしれない。ならそこで普通のPCAをやろう」。SVMで非線形分離をやったのとまったく同じ着想です(サポートベクターマシン(SVM))。

問題は、特徴空間が高次元(無限次元のこともある)なので ϕ\phi を明示的に計算したくないこと。ここでカーネルトリックが効きます。

数理:グラム行列の固有値分解

特徴空間での共分散行列を固有値分解したいのですが、PCAの主成分は「データ点の線形結合」で書けることを使うと、計算を内積だけに落とせます。カーネル関数 k(xi,xj)=ϕ(xi)ϕ(xj)k(\mathbf{x}_i, \mathbf{x}_j) = \phi(\mathbf{x}_i)^\top \phi(\mathbf{x}_j) を成分に持つ N×NN \times Nグラム行列(カーネル行列) KK を作ると、解くべきは次の固有値問題になります:

Ka=NλaK \mathbf{a} = N\lambda\, \mathbf{a}

ここで a\mathbf{a}KK の固有ベクトル、NN はデータ数です。特徴空間での第 kk 主成分 Vk\mathbf{V}^kVk=i=1Naikϕ(xi)\mathbf{V}^k = \sum_{i=1}^{N} a_i^k\, \phi(\mathbf{x}_i) という形で表され、新しい点 x\mathbf{x} をこの成分へ射影した値は

Vkϕ(x)=i=1Naikk(xi,x)\mathbf{V}^{k\top}\phi(\mathbf{x}) = \sum_{i=1}^{N} a_i^k\, k(\mathbf{x}_i, \mathbf{x})

と、やはりカーネル評価だけで計算できます。ϕ\phi は一度も出てきません。

要するに:カーネルPCAは「共分散行列ではなく N×NN \times N のカーネル行列を固有値分解するPCA」です。ϕ\phi を計算せず、点と点のカーネル値だけで非線形な主成分が取り出せます。

中心化の扱い(一言)

普通のPCAはデータを平均0に中心化してから行います。カーネルPCAでも特徴空間で中心化する必要がありますが、ϕ\phi を直接触れないので、カーネル行列 KK の側で中心化します。中心化済みの行列 KK'

K=K1NKK1N+1NK1NK' = K - \mathbf{1}_N K - K \mathbf{1}_N + \mathbf{1}_N K \mathbf{1}_N

で得られます(1N\mathbf{1}_N は全要素が 1/N1/NN×NN \times N 行列)。これも入力空間の量だけで計算できる点がカーネルトリックの恩恵です。この中心化を忘れると主成分がずれるので、実装上の定番の落とし穴です。

カーネルPCAの位置づけ

カーネルPCAは「成分(軸)を取り出せる」のが強みです。線形PCAの素直な非線形拡張なので、新しい点の射影(out-of-sample)も上の式で計算でき、前処理として下流のモデルに渡せます。一方で、カーネルとそのパラメータ(RBFカーネルの幅など)の選び方に結果が強く依存し、N×NN \times N 行列を扱うのでデータが大きいと重い、という弱点があります。

4. t-SNE:近傍の確率を合わせる

着想

t-SNE(t-distributed Stochastic Neighbor Embedding) は、可視化(2〜3次元)に特化した手法です。発想は「点の座標そのものではなく、点どうしの近さの“確率”を、高次元と低次元で一致させよう」というもの。

高次元側:近傍を確率で表す

高次元では、点 ii から見て点 jj が「近傍である確率」を、ii を中心としたガウシアンで定義します:

pji=exp ⁣(xixj2/2σi2)kiexp ⁣(xixk2/2σi2)p_{j|i} = \frac{\exp\!\left(-\lVert \mathbf{x}_i - \mathbf{x}_j \rVert^2 / 2\sigma_i^2\right)}{\sum_{k \neq i} \exp\!\left(-\lVert \mathbf{x}_i - \mathbf{x}_k \rVert^2 / 2\sigma_i^2\right)}

近いほど確率が高く、遠いほど指数的に小さくなります。これを左右対称にした同時確率 pij=pji+pij2Np_{ij} = \dfrac{p_{j|i} + p_{i|j}}{2N} を使います(対称化することで孤立点の扱いが安定します)。

perplexity:実効的な近傍数

各点の幅 σi\sigma_i は唯一のハイパーパラメータ**perplexity(パープレキシティ)**から決まります。perplexity は確率分布 PiP_i のシャノンエントロピー H(Pi)H(P_i) を使って

Perp(Pi)=2H(Pi),H(Pi)=jpjilog2pji\mathrm{Perp}(P_i) = 2^{H(P_i)}, \qquad H(P_i) = -\sum_j p_{j|i} \log_2 p_{j|i}

と定義され、直観的には「各点が実効的に何個の近傍を持つとみなすか」を表します。perplexity を決めると、各点でその値になるよう σi\sigma_i を二分探索で合わせます。典型値は 5〜50 です。

要するに:perplexity は「近傍を何個ぶん見るか」のつまみ。小さいと細かい局所、大きいと大域寄りになります。

crowding problem と t分布

低次元側の近さ qijq_{ij} には、ガウシアンではなく自由度1のスチューデントt分布を使います:

qij=(1+yiyj2)1kl(1+ykyl2)1q_{ij} = \frac{\left(1 + \lVert \mathbf{y}_i - \mathbf{y}_j \rVert^2\right)^{-1}}{\sum_{k \neq l}\left(1 + \lVert \mathbf{y}_k - \mathbf{y}_l \rVert^2\right)^{-1}}

なぜt分布か。これが混雑問題(crowding problem)への対処です。高次元で「どれも適度に離れている」点を低次元(2次元)に詰め込むと、置き場所が足りずに全部が中心に潰れて団子になる——これが crowding です。t分布はガウシアンより裾が重いので、低次元で点を少し遠くに置いても確率が極端に小さくならない。結果、団子化を避けてクラスタが適度にほどけます。

学習:KLダイバージェンス最小化

あとは高次元の分布 PP と低次元の分布 QQ を近づけるだけ。「分布間の近さ」の尺度としてKLダイバージェンスを使い、低次元座標 yi\mathbf{y}_i について最小化します:

C=KL(PQ)=ijpijlogpijqijC = \mathrm{KL}(P \,\Vert\, Q) = \sum_{i}\sum_{j} p_{ij} \log \frac{p_{ij}}{q_{ij}}

KLは非対称で、「pijp_{ij} が大きい(高次元で近い)のに qijq_{ij} が小さい(低次元で遠い)」ペアを強く罰します。つまり局所的な近さの保存を優先し、勾配降下で座標を動かして団子をほどいていきます。逆に「高次元で遠いのに低次元で近い」ことへのペナルティは弱いので、大域的な配置はあまり守られない——これが後述の誤読注意の根っこです。

5. UMAP:位相的な着想で速く

UMAP(Uniform Manifold Approximation and Projection) は、t-SNEと似た見た目の埋め込みを作りますが、位相幾何(topology)とグラフの理論に着想を得た手法です。

ざっくりした流れは、(1) 各点の周りに近傍を取ってファジィな近傍グラフ(fuzzy simplicial set)を組み、データ多様体の位相構造を近似する。(2) 低次元側でも同じグラフを組み、両者のクロスエントロピーを最小化して座標を最適化する。t-SNEの「近傍確率を合わせる」を、確率というよりグラフの辺の重みの一致として定式化したものと捉えると見通しが良いです。

実務上よく言われる UMAP の特徴(要最新確認:この領域は速く動くため、最新版の挙動・既定値は公式ドキュメントで確認してください):

要するに:UMAP は「t-SNE を高速化し、グラフ理論で定式化し直した近縁手法」。速さは本物ですが、大域構造の優位性は条件つきで、過信は禁物です。

6. ⚠️ t-SNE / UMAP の誤読(最重要)

可視化結果は論文や報告で最も誤読される図のひとつです。以下は守ってください。

検証のコツ:見えたクラスタは、元の高次元空間で k-means や DBSCAN を回す・別手法(UMAP↔t-SNE)でも同じ塊が出るか確認する、など図の外で裏取りしてから主張しましょう。

7. 使い分けと他手法との関係

graph TD
    PCA["線形PCA<br/>平らな構造・成分が解釈可能"] -->|"カーネルで非線形化"| KPCA["カーネルPCA<br/>成分を取り出せる / 射影可能"]
    PCA -->|"距離を保つ線形埋め込み"| MDS["古典的MDS<br/>距離から座標 / 統計側"]
    MANI["多様体仮説<br/>低次元の曲がった面に乗る"] --> KPCA
    MANI --> TSNE["t-SNE<br/>近傍確率のKL最小化 / 可視化専用"]
    MANI --> UMAP["UMAP<br/>位相グラフ / 高速 / 可視化専用"]
    TSNE -.->|"距離・大きさは読まない"| WARN["⚠ 絵を読みすぎない"]
    UMAP -.-> WARN

まとめ


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

simulations/kernel_pca.py:同心円状(線形分離できない)データに線形PCAとカーネルPCA(RBF)をかけて比べます。線形PCAは射影しても内側・外側の円が混ざったままなのに対し、カーネルPCAは高次元へ写してから主成分をとるため、主成分空間で2クラスが直線で分けられる形に展開されることを可視化します。SVMのカーネル(サポートベクターマシン(SVM))と同じ発想です。

カーネルPCAが非線形データを展開

関連ノート