まとめ- UMAP(Uniform Manifold Approximation and Projection)はリーマン幾何とトポロジーに基づき、高次元データの局所・大域構造を保って低次元に写像する。
- t-SNE より高速(O(N) に近い)で、大規模データ(数十万点以上)にもスケールする。
- 次元削減だけでなく、クラスタリングの前処理や教師あり次元削減(ラベル活用)にも使える。
- t-SNE — UMAP と比較されることが多い非線形次元削減
- PCA — 線形次元削減の基本
直感
#
t-SNE は近い点同士の関係を保つが、遠い点のクラスター間距離は信頼できない。UMAP は「高次元でのトポロジー(接続構造)を低次元でも維持する」ことを目的関数にしているため、クラスター間の相対的な距離も意味を持ちやすい。
詳細な解説
#
ライブラリとデータ
#
1
2
3
4
5
6
7
| import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
import umap
digits = load_digits()
X, y = digits.data, digits.target
|
基本的な次元削減
#
1
2
3
4
5
6
7
8
| reducer = umap.UMAP(n_neighbors=15, min_dist=0.1, n_components=2, random_state=42)
embedding = reducer.fit_transform(X)
plt.figure(figsize=(8, 6))
scatter = plt.scatter(embedding[:, 0], embedding[:, 1], c=y, cmap="tab10", s=5, alpha=0.7)
plt.colorbar(scatter, label="Digit")
plt.title("UMAP — Digits Dataset")
plt.show()
|
主要パラメータ
#
| パラメータ | 意味 | 効果 |
|---|
n_neighbors | 局所構造の範囲(近傍数) | 小→局所構造重視、大→大域構造重視 |
min_dist | 低次元での最小距離 | 小→密なクラスター、大→均一に散らばる |
metric | 距離関数 | “euclidean”, “cosine”, “manhattan” など |
n_components | 出力次元数 | 2(可視化)、10-50(前処理) |
t-SNE との比較
#
1
2
3
4
5
6
7
8
9
10
11
12
| from sklearn.manifold import TSNE
tsne = TSNE(n_components=2, perplexity=30, random_state=42)
tsne_embedding = tsne.fit_transform(X)
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
axes[0].scatter(embedding[:, 0], embedding[:, 1], c=y, cmap="tab10", s=5)
axes[0].set_title("UMAP")
axes[1].scatter(tsne_embedding[:, 0], tsne_embedding[:, 1], c=y, cmap="tab10", s=5)
axes[1].set_title("t-SNE")
plt.tight_layout()
plt.show()
|
教師あり UMAP
#
1
2
| reducer_supervised = umap.UMAP(n_neighbors=15, min_dist=0.1, random_state=42)
embedding_sup = reducer_supervised.fit_transform(X, y=y)
|
UMAP vs t-SNE vs PCA
#
| 手法 | 速度 | 大域構造の保持 | 大規模データ | 新規データの transform |
|---|
| PCA | 最速 | ○(線形のみ) | ○ | ○ |
| t-SNE | 遅い | △ | △ | △ |
| UMAP | 速い | ○ | ○ | ○ |