論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
t-SNE
t-Distributed Stochastic Neighbor Embedding
次元削減

🔖 キーワード索引

t-SNEt-Distributed Stochastic Neighbor Embedding次元削減

本ページは t-SNE(t-Distributed Stochastic Neighbor Embedding)を多角的に解説します。 上のチップは、 検索・関連語の手がかりです。

💡 30秒で分かる結論

📍 文脈 — どこで使う概念か

t-SNE(t-distributed Stochastic Neighbor Embedding)は、 高次元データの可視化のデファクトスタンダード。 単細胞 RNA-seq、 単語埋め込み、 画像特徴量など、 「数百〜数千次元のデータを 2 次元で見たい」場面で活躍。 ただし「クラスタ間の距離」を素朴に解釈すると誤るので、 使い方の注意が多い手法でもあります。

🎨 直感で掴む — 具体例で理解する

t-SNE の発想:

  1. 高次元空間で「点 $i$ が点 $j$ の近傍である確率」$p_{ij}$ を計算
  2. 低次元空間で同様に $q_{ij}$ を計算
  3. 2 つの確率分布の KL ダイバージェンスを最小化するように低次元の点を配置

結果として:近い点は近く、 遠い点は遠く配置される。 ただし「2 つのクラスタの間の距離」は 意味なし(perplexity 等で歪む)。

用途:単語ベクトル(Word2Vec)の可視化、 細胞種の発見、 画像特徴量のクラスタ確認、 異常検知の探索。 ML パイプラインの 探索ツールとして強力。

📐 定義・数式

【高次元の確率(ガウス)】
$$p_{j|i} = \frac{\exp(-\|\mathbf{x}_i - \mathbf{x}_j\|^2 / 2\sigma_i^2)}{\sum_{k \ne i} \exp(-\|\mathbf{x}_i - \mathbf{x}_k\|^2 / 2\sigma_i^2)}$$
$\sigma_i$ は perplexity から決定
【低次元の確率(t 分布)】
$$q_{ij} = \frac{(1 + \|\mathbf{y}_i - \mathbf{y}_j\|^2)^{-1}}{\sum_{k \ne l} (1 + \|\mathbf{y}_k - \mathbf{y}_l\|^2)^{-1}}$$
分母が重い t 分布で「混雑問題」を緩和

🔬 記号・要素の読み解き

$p_{ij}$(高次元)
元データでの近傍確率
$q_{ij}$(低次元)
埋め込み先での近傍確率
perplexity
「効果的な近傍数」を指定。 5〜50 が標準。 結果が大きく変わる
t 分布
低次元側に重い裾の分布を使うことで、 遠点を程よく押し離す
KL 発散
2 つの確率分布の差。 これを最小化
iteration
通常 1000 ステップ程度で収束

🧮 数値例・実値計算

perplexity の効果(同じデータでも見え方が変わる):

perplexity見え方注意
5局所構造重視、 細かいクラスタ大域構造は壊れる
30(既定)バランス標準的
50大域構造重視、 大まかなクラスタ細部消える
100+ほぼ単一クラスタにサンプル数次第

複数の perplexity で実行し、 ロバストな構造を確認するのが推奨。

🐍 Python 実装例

最小コードで動かしてみる例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
from sklearn.manifold import TSNE
from sklearn.datasets import load_digits
import matplotlib.pyplot as plt

digits = load_digits()  # 64次元 → 2次元へ
tsne = TSNE(n_components=2, perplexity=30, random_state=0)
emb = tsne.fit_transform(digits.data)

plt.scatter(emb[:, 0], emb[:, 1], c=digits.target, cmap='tab10', s=10)
plt.title('t-SNE 可視化(MNIST 数字)')
plt.colorbar()
plt.show()

⚠️ よくある落とし穴

❌ クラスタ間距離の誤解
「クラスタ A と B の距離」は 意味なし。 t-SNE は局所構造のみ保証。
❌ perplexity 依存
perplexity を変えると見え方が激変。 複数試して比較する。
❌ ランダム性
毎回違う見た目になる。 random_state を固定。
❌ 大規模データで遅い
数万点で時間がかかる。 大規模なら UMAP か Barnes-Hut t-SNE を。
❌ 新規データの埋め込み不能
学習済みモデルへの追加投影が困難(UMAP は可能)。