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よりも近いと計算できました。
あれ、なんかこれ相関係数に似てるなーと思ったら、、
相関係数とコサイン類似度は数学的にはほぼ等価であり、どちらもベクトルのノルムで正規化した内積です。
やっぱり。。ロジック自体はほぼ一緒でしょうね。