cos類似度とは
cos類似度は2つのベクトルの類似度を表す指標の一つです。
これは以下の図を見てもらった方が理解できると思います。
ここでは、二つのベクトル(赤と青)があるとします。
左の図であれば二つのベクトルのなす角は \(\theta = 180 ^\circ\)であり、\(\cos 180 ^\circ = -1\)です。
つまり、二つのベクトルはまったく異なるベクトルと判断できます。
逆に右の図のように \(\theta = 0 ^\circ\)であれば \(\cos 0 ^\circ = 1\) となり、 2つのベクトルは似ている(同じ向き)のベクトルと判断できます。
このようにcos類似度を用いることで二つのベクトルがどの程度似てるか(どれくらい同じ向きか)を判断できます。
\(\cos \theta \)の値は2つのベクトルの内積の公式から簡単に求めることができます。
$$ \cos \theta = \frac{\bf a \cdot \bf b}{||\textbf{ a }|| || \textbf{b} ||} = \frac{\sum _i a_i b_i}{\sqrt{\sum _i a_i^2}\sqrt{\sum _i b_i^2}} $$
メモ
よく\(\cos \theta = \bf A \cdot \bf B \)とあったりしますが、これは\(\bf A = \frac{\bf a }{|| \bf a ||}\)となっているだけです。
Pythonで計算してみる
def calc_cos_sim(a, b):
return np.dot(a, b) / (np.linalg.norm(a, ord=2) * np.linalg.norm(b, ord=2))
# 角度が同じ
a = np.array([2,1])
b = np.array([4,2])
print(calc_cos_sim(a, b))
# => 0.9999999999999998
# theta = 90の時
a = np.array([0,1])
b = np.array([1,0])
print(calc_cos_sim(a, b))
# => 0.0
# theta=180の時
a = np.array([2,1])
b = np.array([-2,-1])
print(calc_cos_sim(a, b))
# => -0.9999999999999998
コメント