【入門】cos類似度(コサイン類似度)【Python】

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

コメント

タイトルとURLをコピーしました