距離

Eval

距離

まとめ
  • 距離・類似度の役割と適用シナリオをカテゴリ別に整理します。
  • ベクトル、確率分布、最適輸送など代表的な距離の特徴と計算方法を俯瞰します。
  • 正規化や次元削減と組み合わせる際の注意点をまとめます。

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 が近いと判断されやすい。


距離選択の指針 #

  1. スケールの影響を確認
    • スケールが異なる特徴を持つ場合は正規化(z-score、min-max)を検討。
  2. 疎・密の特性
    • スパースベクトル(TF-IDFなど)ではコサイン距離が安定。
  3. 確率分布か否か
    • 分布比較ではKL/JSD/ヘリンガー。サポートの違いに注意。
  4. 形状の違いを重視するか
    • ワッサースタイン距離は平均・分散だけでなく分布の形を反映。
  5. 計算コストとのトレードオフ
    • 高次元データや大規模データでは近似手法(LSH、Sinkhorn)も検討。

クイックリファレンス #

カテゴリ指標用途注意点
ベクトルコサイン類似度テキスト、埋め込み、疎データゼロベクトルに注意
ベクトルユークリッド / L1 / L∞ 距離連続特徴のクラスタリングスケールの影響が大きい
分布KL ダイバージェンスモデル分布と実データの差非対称、ゼロ確率に敏感
分布Jensen-Shannon対称性が必要なとき距離(平方根)として利用可能
分布ヘリンガー距離ベイズ推論、ドリフト検知ヒストグラム設計に注意
最適輸送ワッサースタイン距離生成モデル評価、異常検知計算が重い。Sinkhorn などの近似を検討

チェックリスト #

  • データがベクトルか分布か、どちらを扱うか明確化したか
  • 距離の前提(ノルム、対称性、三角不等式)を理解したか
  • 前処理(正規化・次元削減)の影響を確認したか
  • 距離計算のコストと近似手法を検討したか
  • 距離の変化がモデル判断に与える影響を可視化したか