コサイン類似度

cos(a,b) = 内積 / 絶対値|a|*|b| = /|a|*|b|

ベクトル向きが逆の時は -1
直行は 0
平行なら 1

Word2Vecやfasttextなどは、cos類似度で類似テキストを推定していましたね。
例えば、以下の様に、Y1とY2を用意して、X1とどちらが近いかという計算ができます。

import numpy as np

def cos_sim(v1, v2):
	return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))

X1 = np.array([0.782,0.514,0.334,3])
Y1 = np.array([0.457,0.823,0.664,14])
Y2 = np.array([0.256,0.565,0.335,2.4])

print(cos_sim(X1,Y1))
print(cos_sim(X1,Y2))

[vagrant@localhost python]$ python app.py
0.9686648214589598
0.9870228673135825

Cos類似度はY2の方がY1よりも近いと計算できました。

あれ、なんかこれ相関係数に似てるなーと思ったら、、

相関係数とコサイン類似度は数学的にはほぼ等価であり、どちらもベクトルのノルムで正規化した内積です。

やっぱり。。ロジック自体はほぼ一緒でしょうね。