K_DM Book
用語集
対象者 標準
対象者別の入口 →

対象者の設定はこのブラウザの中にだけ保存されます。

言語 JA

UMAP

02.7.7

UMAP

最終更新 2026-03-03 読了時間 4 分
まとめ
UMAP(Uniform Manifold Approximation and Projection)は、高次元データの「どの点とどの点がつながっているか」をファジーなグラフとして取り出し、同じつながりを 2 次元でも再現するように点を配置する非線形の次元削減です。各点の n_neighbors 個の近傍から接続確率 \(v_{ij}\) を作り、低次元の点の間の類似度 \(w_{ij}\) との交差エントロピーを確率的勾配降下法で最小化します。t-SNE より速く(点の数にほぼ比例)、数十万点でも実行でき、斥力項が明示的にあるのでクラスター間の相対的な配置も意味を持ちやすいのが特徴です。可視化のほかに、fit_transform(X, y=y) でラベルを使う教師あり次元削減や、HDBSCAN をかける前の前処理にも使えます。
  • t-SNE — UMAP と比較されることが多い非線形次元削減
  • PCA — 線形次元削減の基本

直感 #

高次元の点の集まりを「各点から近い 15 人に糸を張った網」と考えます。UMAP はこの網を机の上(2 次元)に広げ直します。糸でつながった 15 人は近くに、つながっていない点は離れた場所に置く。これを全点について同時に調整するので、手書き数字なら「0 の網」「1 の網」がそれぞれ 1 つの島になります。t-SNE も近い点同士の関係を保ちます。ただし t-SNE は遠い点の配置にほとんど力をかけないので、島同士の距離は信頼できません。UMAP は「つながっていない点を離す」斥力を目的関数に明示的に含めるため、島同士の相対的な距離にも意味が残りやすくなります。

数学的定式化 #

UMAPはリーマン幾何とファジー集合論に基づき、高次元と低次元で「トポロジカルな構造」を一致させるよう最適化します。式は 5 段階で、前半 2 つが高次元側のグラフ作り、後半 3 つが低次元側の配置決めです。

高次元グラフの構築 #

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

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

$\sigma_i$ は各点の近傍数が指定した n_neighbors(= $k$)と整合するよう、次の式を満たす値に 2 分探索で決定されます。密な領域では $\sigma_i$ が小さく、疎な領域では大きくなるので、点ごとに距離の尺度が変わります:

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

対称化 #

$v_{j|i}$ は「$i$ から見た $j$」なので向きがあります。有向グラフを無向グラフに変換するため、ファジー和(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 族のカーネルで定義します。Student-t 分布のように遠くまで裾が重い関数なので、少し離れた点を無理に引き寄せません:

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

パラメータ $a, b$ は min_dist から自動決定されます。min_dist が小さいほど $w_{ij}$ が近距離で急に立ち上がり、点が密に固まります。$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^2)$ になるので、負のサンプリング(各点について数個のランダムな点だけを斥力の相手に選ぶ)で計算量を $O(N)$ に近づけています。


詳細な解説 #

ライブラリとデータ #

umap-learn パッケージと、scikit-learn 付属の手書き数字データ(8 × 8 ピクセル = 64 次元、1797 点)を読み込みます。

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

基本的な次元削減 #

umap.UMAP(n_neighbors=15, min_dist=0.1) で 64 次元を 2 次元に落とし、数字ごとに色を付けて描きます。

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 との比較 #

同じ 1797 点を TSNE(perplexity=30) でも埋め込んで左右に並べます。

 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 #

fit_transform にラベル y を渡すと、同じラベルの点を近づける教師あり 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速い○○○

使いどころと落とし穴 #

UMAP が向くのは、数万点以上の高次元データを可視化したい場面と、HDBSCAN のような密度ベースのクラスタリングの前に 5〜10 次元へ落として距離を意味のあるものにしたい場面です。transform で新しい点を写せるので、学習時と推論時で同じ埋め込みを使うパイプラインにも組み込めます。落とし穴は 3 つあります。n_neighbors と min_dist で図の見え方が大きく変わるので、1 枚の図から「島の数」を断定しないこと。島の面積や点の密度は元の 64 次元での密度を反映しないので、UMAP の座標上の距離を数値として解釈しないこと。乱数に依存するので、random_state を固定した上で複数の seed で島の構造が再現するかを確かめることです。

まとめ #

UMAP は各点の n_neighbors 個の近傍から接続確率 $v_{ij}$ のファジーなグラフを作り、低次元の類似度 $w_{ij}$ との交差エントロピーを SGD で最小化して配置を決めます。斥力項が明示的に含まれるため、手書き数字 1797 点では 10 個の島が分かれ、さらに 4 と 9 のように似た数字の島が隣り合う大域的な配置も残りました。t-SNE より速く、transform で新しい点を写せるので、可視化だけでなく前処理やパイプラインにも使えます。n_neighbors と min_dist で見え方が変わり、埋め込み上の距離や密度に数値的な意味はないことを踏まえて読みます。

  • t-SNE — 局所構造重視の可視化手法
  • PCA — 分散を最大化する軸を回す線形次元削減の基本
  • HDBSCAN — UMAP の出力にクラスタリングを適用