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