コサイン類似度と距離

Eval

コサイン類似度と距離

作成日: 最終更新: 読了時間: 1 分
まとめ
  • コサイン類似度はベクトルの角度に基づき近さを測るシンプルな指標です。
  • 文書ベクトルやユーザ埋め込みでの計算手順を Python で確認します。
  • 正規化やゼロベクトルの扱いなど実務での注意点を整理します。

1. 定義と直感 #

ベクトル \(\mathbf{a}, \mathbf{b}\) に対して、コサイン類似度は角度 \(\theta\) の余弦として定義されます。

$$ \cos(\theta) = \frac{\mathbf{a} \cdot \mathbf{b}}{|\mathbf{a}| , |\mathbf{b}|} $$

  • 1 に近いほど同じ方向(類似)、0 付近は直交(無関連)、-1 に近いほど反対方向です。
  • 距離として使う場合は \(d = 1 - \cos(\theta)\) を取れば 0~2 の範囲で解釈できます。

長さ(ベクトルのノルム)ではなく向きだけを比較できるため、スケールの異なる特徴を組み合わせたベクトルにも適しています。


2. Python による計算例 #

import numpy as np
from sklearn.metrics.pairwise import cosine_similarity, cosine_distances

# 行列は (サンプル, 特徴量) で並んでいる前提
embeddings = np.array(
    [
        [0.1, 0.4, 0.5],
        [0.2, 0.2, 0.6],
        [0.6, 0.3, 0.1],
    ]
)

# 類似度(1 に近いほど似ている)
sim_matrix = cosine_similarity(embeddings)

# 距離(0 に近いほど似ている)
dist_matrix = cosine_distances(embeddings)

print(sim_matrix.round(3))
print(dist_matrix.round(3))

単一のベクトルペアを扱う場合は scipy.spatial.distance.cosine を使うと手軽です。疎行列であれば sklearn.metrics.pairwise.cosine_similarity が内部で効率的に計算してくれます。


3. 特長と適用シナリオ #

  • スケール不変:値の大きさよりも向きを重視でき、TF-IDF ベクトルや埋め込みで有効です。
  • 疎ベクトルとの相性:非ゼロ要素が少ない場合でも安定して計算できます。
  • 負の値に注意:特徴に負の成分が含まれる場合は意味を解釈できるよう前処理(中心化など)を検討します。

4. 実務での活用例 #

  • 検索・レコメンド:クエリとアイテムのベクトル類似度でランキングを構築。
  • クラスタリング:コサイン距離を用いた k-means(球面 k-means)でトピックを抽出。
  • 埋め込み評価:正例・負例との類似度分布を比較してベクトル表現の品質を診断。

5. 注意点 #

  • ノルムが 0 のベクトルでは類似度が定義できないため、ゼロベクトルは除外するか微小値を加える処理を挟みます。
  • 距離として扱う場合、三角不等式を満たさないためメトリック前提のアルゴリズムでは適用可否を確認します。
  • ベクトルの角度に敏感なため、標準化や正規化などの前処理と合わせて効果を検証しましょう。

まとめ #

コサイン類似度はベクトルの向きを比較するシンプルな指標で、距離は \(1 - \text{cosine}\) として表現できます。疎ベクトルや埋め込みとの相性が良く、検索・レコメンド・評価タスクで頻繁に用いられますが、ゼロベクトルや距離特性に関する注意点を押さえて活用しましょう。