はじめに
今回は、データを分析する上でよく利用する、cos類似度とユークリッド距離の特徴について、pythonでの計算方法も含めて整理する。
cos類似度
cos類似度は、「2つのベクトルがどれくらい同じ向きを表すか」という指標である。
-1 ~ 1の大きさで表され、1に近いほど同じ向き、-1に近いほど逆向きを表す。
cos類似度は以下の$ \vec{a} , \vec{b}$に対して次のように計算できる。
$ \vec{a} = (a_{1}, a_{2}, \dots, a_{n})$
$ \vec{b} = (b_{1}, b_{2}, \dots, b_{n})$
cos(\vec{a}, \vec{b}) = \frac{\vec{a}\cdot\vec{b}}{||\vec{a}||||\vec{b}||} = \frac{a_1b_1 + a_2b_2 + \dots + a_nb_n}{\sqrt{a_1^2+a_2^2+\dots+a_n^2}\sqrt{b_1^2+b_2^2+\dots+b_n^2}} = \frac{\sum_{k=1}^{n} a_kb_k}{\sqrt{\sum_{k=1}^{n} a_k^2}\sqrt{\sum_{k=1}^{n} b_k^2}}
pythonで計算する場合には、
import numpy as np
def cos_sim(v1, v2):
return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))
# ランダムな10次元のベクトル
a = np.random.rand(10)
b = np.random.rand(10)
print('a: ', a)
print('b: ', b)
print('cos similarity: ', cos_sim(a, b))
実行結果
a: [0.31259239 0.18294101 0.8703613 0.29128793 0.69347741 0.76973266
0.98018287 0.01044076 0.82078744 0.82932976]
b: [0.75459465 0.33183332 0.2548693 0.35365664 0.58158927 0.93896414
0.57150148 0.14465323 0.75074658 0.07762678]
cos similarity: 0.8248795445668491
ユークリッド距離
ユークリッド距離は、「2つのベクトルがどのくらい離れているか」という、通常の距離を表す。
ユークリッド距離は以下の$ \vec{a} , \vec{b}$に対して次のように計算できる。
$ \vec{a} = (a_{1}, a_{2}, \dots, a_{n})$
$ \vec{b} = (b_{1}, b_{2}, \dots, b_{n})$
d(\vec{a}, \vec{b}) = \sqrt{(a_1 - b_1)^2 + (a_2 - b_2)^2 + \dots + (a_n - b_n)^2} = \sqrt{\sum_{k=1}^{n} (a_k - b_k)^2}
pythonで計算する場合には、
import numpy as np
# ランダムな10次元のベクトル
a = np.random.rand(10)
b = np.random.rand(10)
print('a: ', a)
print('b: ', b)
# ユークリッド距離の計算はnp.linalg.norm(a - b)
print('euclidean distance: ', np.linalg.norm(a - b))
実行結果
a: [0.9823155 0.94764446 0.86399628 0.09872733 0.05527034 0.05466513
0.86314938 0.0836662 0.12518881 0.41020441]
b: [0.0328892 0.56833557 0.80928533 0.94658235 0.21963456 0.41970579
0.64829739 0.08993147 0.06716679 0.96082468]
euclidean distance: 1.5100189038464435
まとめ
cos類似度とユークリッド距離の計算方法について、計算式とpythonでの計算方法をまとめた。
必要に応じて使い分けができるようにしたい。
参考文献
https://mathtrain.jp/cosdistance
https://qiita.com/Qiitaman/items/fa393d93ce8e61a857b1
https://sitest.jp/blog/?p=6784