LoginSignup
0
1

More than 3 years have passed since last update.

cos類似度とユークリッド距離の計算

Posted at

はじめに

今回は、データを分析する上でよく利用する、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で計算する場合には、

cos類似度の計算
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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1