コサイン類似度
コサイン類似度 - Wikipedia
コサイン類似度(コサインるいじど、Cosine similarity)はデータ分析において、内積空間で定義される二つの非零ベクトル間の類似度の尺度(英語版)である。
コサイン類似度をプログラミングはできるが計算機科学や統計に疎いエンジニアにもわかりやすく説明せよmtane0412.icon
計算機科学に疎いエンジニア is 何mtane0412.icon
コサイン類似度(Cosine Similarity)は,ベクトル同士の「向き」の近さを測る指標です。プログラミングはできるけれど,数学的なバックグラウンドが薄いエンジニア向けに,以下の順でやさしく説明します。ChatGPT.icon
1. どういう場面で使うか?
文章やドキュメントの「似ている度合い」を数値化したい
ユーザーの嗜好ベクトル(好きなジャンルのスコア)を比較したい
画像特徴ベクトルの近さを測って検索に使いたい
いずれも「量の差」ではなく「方向の差」を見るイメージです。
2. ベクトルと「角度」のイメージ
1. 各要素を座標として,n 次元空間に点をプロット
2. 原点からその点へ向かう矢印(ベクトル)を考える
3. 2本の矢印のなす角 θ(シータ)が小さいほど,似ているとみなす
<center> → ベクトルA ↗ ベクトルB </center>
角度が 0° に近いほど「ほぼ同じ方向」を向いている,つまり「似ている」と判断します。
3. 数式で見るコサイン類似度
ベクトル A = (a₁, a₂, …, aₙ),B = (b₁, b₂, …, bₙ) に対し,
$ \cos\theta = \frac{\mathbf{A}\cdot\mathbf{B}}{\|\mathbf{A}\|\;\|\mathbf{B}\|} = \frac{\displaystyle\sum_{i=1}^{n} a_i b_i} {\displaystyle\sqrt{\sum_{i=1}^{n} a_i^2}\;\sqrt{\sum_{i=1}^{n} b_i^2}}
分子:内積(dot product)= 各次元の積の合計
分母:大きさ(ノルム)同士の掛け算
結果は –1~+1 の範囲をとりますが,実務では非負のデータ(頻度や重みなど)を扱うため,0~1 の間に収まることが多いです。
4. 実装イメージ(Python 例)
code:python
import math
def cosine_similarity(a, b):
# 分子:内積
dot = sum(ai * bi for ai, bi in zip(a, b))
# 分母:ノルム(大きさ)
norm_a = math.sqrt(sum(ai * ai for ai in a))
norm_b = math.sqrt(sum(bi * bi for bi in b))
if norm_a == 0 or norm_b == 0:
return 0.0 # 片方がゼロベクトルなら類似度を 0 とみなす
return dot / (norm_a * norm_b)
# 例
vec1 = 1, 2, 3
vec2 = 2, 4, 6
print(cosine_similarity(vec1, vec2)) # 出力: 1.0 (まったく同じ方向)
5. ポイントまとめ
「向きの近さ」 を測るので,ベクトルの長さ(大きさ)の違いを無視できる
テキストの Bag-of-Words や TF-IDF と組み合わせ,文章の類似検索に使われる
0 に近い → 無関係,1 に近い → 非常に似ている