t-SNE

2.4.5

t-SNE

最終更新 2020-03-25 読了時間 1 分
まとめ
  • t-SNE は高次元での近傍関係を低次元でも再現する可視化向け手法である。
  • KL divergence 最小化により局所構造を強く保存し、クラスタの見え方を改善する。
  • perplexity や学習率で結果が変わるため、複数設定で安定性確認が必要である。

直感 #

t-SNEは『近い点は近く、遠い点は必ずしも正確でなくてよい』という設計で、局所構造を重視して2次元へ配置します。クラスタ探索には有効ですが、軸の意味づけより近傍のまとまりを見る手法です。

詳細な解説 #

t-SNE(t-Distributed Stochastic Neighbor Embedding)は高次元データの局所構造を 2 次元や 3 次元に可視化するための手法です。クラスタの分離具合や潜在構造を見る探索的分析に最適です。


1. 仕組みの概要 #

  • 高次元空間で近傍確率 \(P_{ij}\) を構築
  • 低次元空間の点でも同様に \(Q_{ij}\) を定義
  • Kullback-Leibler ダイバージェンス \(\mathrm{KL}(P \parallel Q)\) を最小化するよう座標を更新
  • 対称化した確率と Student-t 分布を使うことでクラスタ間を離す

2. Python 実装 #

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
from sklearn.manifold import TSNE
from sklearn.preprocessing import StandardScaler

X, y = load_digits(return_X_y=True)
X = StandardScaler().fit_transform(X)

model = TSNE(n_components=2, perplexity=30, learning_rate=200, random_state=0)
emb = model.fit_transform(X)

plt.figure(figsize=(8, 6))
plt.scatter(emb[:, 0], emb[:, 1], c=y, cmap="tab10", s=15)
plt.colorbar(label="digit")
plt.title("t-SNE による手書き数字可視化")
plt.tight_layout()
plt.show()

Python 実装の図


3. ハイパーパラメータ #

  • perplexity: 有効近傍数に相当。データ数の 5〜50 程度で探索
  • learning_rate: 低すぎると収束しない、高すぎると構造が崩れる
  • n_iter: 1000 以上を推奨。early_exaggeration でクラスタを離しやすくする

4. 注意点 #

  • 座標はランダム初期化に依存し、絶対位置に意味はない
  • 新しい点を既存埋め込みに追加するのは難しい(openTSNE などが必要)
  • 距離の大小を厳密に解釈してはいけない(近傍関係を見るためのツール)

5. まとめ #

  • t-SNE は探索的データ分析やレポート用の可視化に強力
  • パラメータ感度が高いため複数設定で比較し、再現性を確保する
  • UMAP など後継手法も合わせて検討すると洞察が広がります