まとめ
- 距離・類似度の役割と適用シナリオをカテゴリ別に整理します。
- ベクトル、確率分布、最適輸送など代表的な距離の特徴と計算方法を俯瞰します。
- 正規化や次元削減と組み合わせる際の注意点をまとめます。
Chapter 4 #
距離・類似度指標の全体像 #
距離(類似度)は「データ同士がどれだけ近いか・離れているか」を定量化する基盤です。クラスタリング、レコメンド、異常検知、生成モデル評価など多くのタスクで用いられ、データの性質に合わせて距離を選択する必要があります。
距離の主なカテゴリ #
1. ベクトル空間の距離 #
- ユークリッド距離:最も直感的な距離。スケールの影響が大きいため前処理が重要。
- コサイン類似度 / 距離(コサイン類似度): ベクトルの向きを比較。テキスト埋め込みやTF-IDFで有効。
- マンハッタン距離、チェビシェフ距離:L1ノルム、L∞ノルムでの距離。疎ベクトルやロバストな比較に。
2. 確率分布間距離 #
- KL ダイバージェンス(KL): 一方を基準にした相対エントロピー。非対称でゼロ確率に敏感。
- Jensen-Shannon ダイバージェンス(JSD): KL を対称化し有限値にした距離。
- ヘリンガー距離(Hellinger): 平方根変換で対称性とメトリック性を備える。
3. 最適輸送系の距離 #
- ワッサースタイン距離(Wasserstein): 分布の位置と形状を同時に考慮。生成モデル評価や異常検知で活躍。
- Sinkhorn 距離: 正則化付き最適輸送で計算を高速化。
距離ごとの比較例 #
import matplotlib.pyplot as plt
import numpy as np
from sklearn.metrics.pairwise import cosine_distances, euclidean_distances
embeddings = np.array(
[
[0.2, 0.4, 0.4],
[0.1, 0.9, 0.0],
[0.6, 0.2, 0.2],
[0.3, 0.1, 0.6],
[0.05, 0.45, 0.5],
]
)
labels = ["A", "B", "C", "D", "E"]
cos_dist = cosine_distances(embeddings)
euc_dist = euclidean_distances(embeddings)
combined = np.dstack([cos_dist, euc_dist])
fig, axes = plt.subplots(1, 2, figsize=(7.5, 3.3))
for ax, matrix, title in zip(
axes,
(cos_dist, euc_dist),
("Cosine distance", "Euclidean distance"),
):
im = ax.imshow(matrix, cmap="viridis")
ax.set_xticks(range(len(labels)))
ax.set_yticks(range(len(labels)))
ax.set_xticklabels(labels)
ax.set_yticklabels(labels)
ax.set_title(title)
for i in range(len(labels)):
for j in range(len(labels)):
ax.text(j, i, f"{matrix[i, j]:.2f}", ha="center", va="center", color="white")
fig.colorbar(im, ax=axes.ravel().tolist(), shrink=0.9, label="Distance")
plt.tight_layout()

同じベクトルでも距離の定義によって近傍関係が変わる。コサイン距離はベクトルの向きに敏感で、B と E が近いと判断されやすい。
距離選択の指針 #
- スケールの影響を確認
- スケールが異なる特徴を持つ場合は正規化(z-score、min-max)を検討。
- 疎・密の特性
- スパースベクトル(TF-IDFなど)ではコサイン距離が安定。
- 確率分布か否か
- 分布比較ではKL/JSD/ヘリンガー。サポートの違いに注意。
- 形状の違いを重視するか
- ワッサースタイン距離は平均・分散だけでなく分布の形を反映。
- 計算コストとのトレードオフ
- 高次元データや大規模データでは近似手法(LSH、Sinkhorn)も検討。
クイックリファレンス #
| カテゴリ | 指標 | 用途 | 注意点 |
|---|---|---|---|
| ベクトル | コサイン類似度 | テキスト、埋め込み、疎データ | ゼロベクトルに注意 |
| ベクトル | ユークリッド / L1 / L∞ 距離 | 連続特徴のクラスタリング | スケールの影響が大きい |
| 分布 | KL ダイバージェンス | モデル分布と実データの差 | 非対称、ゼロ確率に敏感 |
| 分布 | Jensen-Shannon | 対称性が必要なとき | 距離(平方根)として利用可能 |
| 分布 | ヘリンガー距離 | ベイズ推論、ドリフト検知 | ヒストグラム設計に注意 |
| 最適輸送 | ワッサースタイン距離 | 生成モデル評価、異常検知 | 計算が重い。Sinkhorn などの近似を検討 |
チェックリスト #
- データがベクトルか分布か、どちらを扱うか明確化したか
- 距離の前提(ノルム、対称性、三角不等式)を理解したか
- 前処理(正規化・次元削減)の影響を確認したか
- 距離計算のコストと近似手法を検討したか
- 距離の変化がモデル判断に与える影響を可視化したか