
くるくる巻いたデータを、PCAは平らにできなかった。多様体学習(Isomap)がスイスロールを"展開"する様子を見てみた
高次元のデータを人間が理解できる2次元・3次元に落とし込む「次元削減」というと、真っ先にPCA(主成分分析)が思い浮かぶ。ただPCAは本質的に「一番良い角度から見た平面に映す」という線形な操作でしかない。データが曲がった構造をしていたら、うまくいかないのではないか。
これを試すのにうってつけの、スイスロールと呼ばれる有名なおもちゃデータセットがある。ロールケーキやシナモンロールのように、平らな1枚のシートをくるくる巻いた形の3次元データだ。実際にPCAと、多様体学習(manifold learning)と呼ばれる手法群(Isomap・LLE・t-SNE)を試して、巻かれた構造をきちんと「展開」できるかを比べてみた。
スイスロールを3Dで眺めてみる
scikit-learnのmake_swiss_rollで、1500点の3次元データを生成した。色は「本当はシート上のどこに位置するか」を表す、渦の巻き具合(1次元のパラメータ )だ。
色の変化(紺色→水色→緑→黄色→オレンジ→赤)を目で追うと、渦を巻きながら滑らかに変化しているのが分かる。本質的には1本の帯(1次元に近い構造)を、3次元空間の中でぐるぐる巻いているだけ、というのがこのデータセットの正体だ。
PCAは平らにできない
まず線形手法の代表であるPCAで2次元に落としてみる。
from sklearn.decomposition import PCA
emb = PCA(n_components=2).fit_transform(X)
結果を、渦の位置 との相関係数で評価した。
PCA: |相関係数|=0.274
相関0.274は、ほとんど関係がないに等しい数字だ。実際に可視化した結果を見ても、渦の色がそのまま渦巻き状に残ったままだった(下の比較図の一番左)。PCAは「一番分散が大きい方向」を素直に選ぶだけなので、巻かれた構造をそのまま真上から見下ろした形で2次元に落としてしまう。渦を1周してくると同じあたりの2次元座標に戻ってきてしまい、本来は遠く離れているはずの「内側の巻き」と「外側の巻き」が2次元上では隣り合ってしまう。
Isomap・LLE・t-SNEを試す
多様体学習と呼ばれる手法は、データが曲がった構造(多様体)の上に乗っていることを前提に、その構造に沿った距離を使って次元削減をする。代表的な3つの手法を試した。
from sklearn.manifold import Isomap, LocallyLinearEmbedding, TSNE
Isomap(n_neighbors=10, n_components=2).fit_transform(X)
LocallyLinearEmbedding(n_neighbors=10, n_components=2).fit_transform(X)
TSNE(n_components=2, perplexity=30, init="pca").fit_transform(X)

PCA: |相関係数|=0.274
Isomap: |相関係数|=0.992
LLE: |相関係数|=0.997
Isomap・LLEはどちらも相関0.99以上、ほぼ完璧に渦の位置を1本の軸に「展開」できている。図を見ても、渦巻き模様が綺麗な色のグラデーションに変わっているのが分かる。一方t-SNEは、全体を通した滑らかな1本の帯ではなく、いくつかの塊に千切れて散らばった。t-SNEは近傍の点同士の関係を再現するのが得意な一方、データ全体を貫く大域的な構造(今回で言う「渦の1本の帯」)を1つに保ったまま展開するのはあまり得意ではない、という違いが、数値ではなく形の違いとしてはっきり出た。
Isomapは何をしているのか: 「面に沿った距離」で測り直す
IsomapとPCAの決定的な違いは、距離の測り方にある。PCAは3次元空間での直線距離(ユークリッド距離)をそのまま使うが、Isomapはまず各点の近傍だけをつないだグラフを作り、そのグラフ上の最短経路距離(測地距離)を「本当の距離」として使う。
from sklearn.neighbors import kneighbors_graph
from scipy.sparse.csgraph import shortest_path
knn_graph = kneighbors_graph(X, n_neighbors=10, mode="distance")
D_geo = shortest_path(knn_graph, method="D", directed=False) # 面に沿った最短経路距離
3次元空間で直線を引けば近く見えても、実際にシートの上を歩いて辿り着くには、渦を回り込む分だけ余計に距離がかかる。この「面に沿った距離」に置き換えたうえで、その距離関係をなるべく保つように2次元に配置し直すのがIsomapの仕組みだ。
巻きが解けていく様子をアニメーションにする
数値や静止画だけでは実感が薄いので、元の3次元のスイスロールの各点が、Isomapが求めた2次元の座標(z=0の平面上)へゆっくり移動していくアニメーションを作った。

渦を巻いていた点群が、色の並び(紺色→赤)を保ったまま、だんだんと伸びて平らになっていく。単なる補間アニメーションではあるが、Isomapが「実現していること」——3次元の曲がった構造を、内部の距離関係をなるべく壊さずに2次元へ引き延ばす——が視覚的にはっきり伝わる。
ちなみに、この2次元配置を勾配降下法で一から求めようとする実験もしてみたが、ランダムな初期値からだと局所的な巻き上がりにはまり込んでしまい、なかなか綺麗に展開できなかった(400点のサブサンプルで、渦の位置との相関は0.46程度止まり)。これは前回の記事でSGDがRosenbrock関数の谷でジグザグに詰まってしまったのと同じ構図で、良い初期値・良いアルゴリズム(Isomapが使う固有値分解のような閉じた形の解法)を選ぶことの大切さを、ここでも実感した。
手を動かして意外だったこと
一番印象に残ったのは、「近い」という感覚がいかに測り方に依存するかという点だった。3次元空間でものさしを当てれば近く見える2点でも、実際にその面の上を移動しなければならないなら、遠く離れていることがある。PCAはものさしを当てるだけの手法で、Isomapは実際に面を歩いて距離を測り直す手法、という違いが、そのまま結果の差になって表れた。
これは人間関係にも似ている気がする。表面的な条件や見た目が近いからといって、本当に「近い」とは限らない。逆に、一見遠く見える人でも、実際に関わってみる(=グラフを辿ってみる)と、驚くほど近い距離でつながっていたりする。直線距離という手軽な指標に頼らず、実際の経路・文脈をたどって距離を測り直すことの価値を、データの上で見せられた気がした。
まとめ
- スイスロール(3次元に巻かれたデータ)にPCAをかけても、渦の位置との相関は0.274とほとんど再現できない。PCAは直線的な射影しかできないため、巻かれた構造をそのまま押しつぶしてしまう
- Isomap(相関0.992)・LLE(相関0.997)はどちらもほぼ完璧に渦を1本の軸へ展開できた。t-SNEは大域的な帯構造を保てず、いくつかの塊に千切れて分散した
- Isomapは、3次元空間での直線距離ではなく、近傍グラフ上の最短経路距離(測地距離)を使うことで、面に沿った「本当の距離」を測り直している
- 3次元の点群がIsomapの2次元配置へ変形していくアニメーションで、渦が色の並びを保ったまま引き伸ばされていく様子を確認できた
- 同じ展開を勾配降下法で一から求めようとすると、ランダムな初期値では局所的な巻き上がりに捕まり相関0.46程度で頭打ちになった。前回の最適化アルゴリズムの実験と同じく、良いアルゴリズム・良い初期値を選ぶことの重要性を裏付ける結果だった


