UMAP

2.6.7

UMAP

最終更新 2026-03-03 読了時間 2 分
まとめ
  • UMAP(Uniform Manifold Approximation and Projection)はリーマン幾何とトポロジーに基づき、高次元データの局所・大域構造を保って低次元に写像する。
  • t-SNE より高速(O(N) に近い)で、大規模データ(数十万点以上)にもスケールする。
  • 次元削減だけでなく、クラスタリングの前処理や教師あり次元削減(ラベル活用)にも使える。
  • t-SNE — UMAP と比較されることが多い非線形次元削減
  • PCA — 線形次元削減の基本

直感 #

t-SNE は近い点同士の関係を保つが、遠い点のクラスター間距離は信頼できない。UMAP は「高次元でのトポロジー(接続構造)を低次元でも維持する」ことを目的関数にしているため、クラスター間の相対的な距離も意味を持ちやすい。

数学的定式化 #

UMAPはリーマン幾何とファジー集合論に基づき、高次元と低次元で「トポロジカルな構造」を一致させるよう最適化します。

高次元グラフの構築 #

各データ点$x_i$について、$k$近傍までの距離から局所的な接続確率を定義します。$\rho_i$は$x_i$の最近傍距離、$\sigma_i$は正規化パラメータです:

$$v_{j|i} = \exp\!\left(-\frac{d(x_i, x_j) - \rho_i}{\sigma_i}\right)$$

$\sigma_i$は各点の近傍数が指定したn_neighbors(= $k$)と整合するよう決定されます:

$$\sum_{j} v_{j|i} = \log_2(k)$$

対称化 #

有向グラフを無向グラフに変換するため、ファジー和(probabilistic t-conorm)で対称化します:

$$v_{ij} = v_{j|i} + v_{i|j} - v_{j|i} \cdot v_{i|j}$$

これにより$v_{ij} \in [0, 1]$の対称な類似度行列が得られます。

低次元での類似度 #

低次元埋め込み$y_i, y_j$間の類似度は、Student-t族のカーネルで定義します:

$$w_{ij} = \left(1 + a \|y_i - y_j\|^{2b}\right)^{-1}$$

パラメータ$a, b$はmin_distから自動決定されます。$a=1, b=1$のとき$t$分布(自由度1)に一致し、t-SNEのカーネルと同等です。

損失関数(ファジー集合交差エントロピー) #

高次元の$v_{ij}$と低次元の$w_{ij}$を一致させるよう交差エントロピーを最小化します:

$$\mathcal{L} = \sum_{i \neq j} \left[ v_{ij} \log\frac{v_{ij}}{w_{ij}} + (1 - v_{ij}) \log\frac{1 - v_{ij}}{1 - w_{ij}} \right]$$

第1項は「近い点を近くに保つ」引力項、第2項は「遠い点を遠くに保つ」斥力項です。t-SNEのKLダイバージェンスと異なり、斥力項が明示的に含まれるため大域構造の保持に有利です。

最適化 #

確率的勾配降下法(SGD)で${y_i}$を更新します。負のサンプリングにより計算量を$O(N)$に近づけています。


詳細な解説 #

ライブラリとデータ #

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速い
  • t-SNE — 局所構造重視の可視化手法
  • PCA — 線形次元削減の基本
  • HDBSCAN — UMAP の出力にクラスタリングを適用