コサイン類似度と距離

最終更新: 1 分で読めます このページを編集

コサイン類似度は 2 つのベクトルのなす角度を評価し、向きがどれだけ似ているかを測る指標です。距離として扱う場合は (1 - \text{cosine similarity}) を用い、テキストや埋め込みベクトルの比較で広く使われます。


1. 定義 #

ベクトル \(\mathbf{a}, \mathbf{b}\) に対して、

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

  • 1 に近い:同じ方向。
  • 0:直交、関連性なし。
  • -1:真逆の方向。

距離として用いる場合は \(d = 1 - \cos(\theta)\) を取ります。


2. Python で計算 #

from sklearn.metrics.pairwise import cosine_similarity, cosine_distances

sim = cosine_similarity(A, B)  # 同じ行列で自己類似度を計算することも可能
dist = cosine_distances(A, B)  # = 1 - cosine_similarity

単一ペアで計算したい場合は SciPy の scipy.spatial.distance.cosine も利用できます。


3. 特徴 #

  • スケール不変:ベクトルの長さ(ノルム)が変わっても、向きが同じなら類似度は 1 のまま。
  • 疎ベクトルに強い:TF-IDF などの高次元疎ベクトルでも扱いやすい。
  • 負の値の扱い:負のエントリがある場合、意味を解釈できるよう前処理を行う(例:中心化や ReLU など)。

4. 実務での応用 #

  • 検索/レコメンド:クエリベクトルとアイテムベクトルの類似度でランキング。
  • 文書クラスタリング:コサイン距離を使った k-means(球面 k-means)でトピックを抽出。
  • 埋め込み評価:埋め込みベクトルの品質を確認する際に、正例・負例とのコサイン類似度を比較。

5. 注意点 #

  • ノルムが 0 のベクトルはコサイン類似度が定義できないため、ゼロベクトルは除外するかスムージングを施す。
  • 距離として利用する場合、三角不等式を必ずしも満たさないため、メトリックが必要なアルゴリズムでは注意が必要。
  • 角度に敏感な指標なので、特徴量のスケーリングや正規化を適切に行う。

まとめ #

  • コサイン類似度はベクトルの向きを比較するシンプルな類似度で、距離は (1 - \text{cosine}) で表現できる。
  • スケール不変で疎ベクトルでも扱いやすく、テキスト・埋め込みの評価に最適。
  • 他の距離(ユークリッド、ワッサースタインなど)と併用し、データの性質に合わせた距離指標を選択しよう。