はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

コサイン類似度についてまとめてみる

はじめに

今回はコサイン類似度とは一体なんなのかについてみていきたいと思います。

いつもと少しテイストが違って数学チックですがお付き合いください。

早速みていきましょう。

なにに使えるか

まず定義をみるよりも先に、これが何に使えるかをみた方がモチベーションもアップすると思い先に書いてしまいます。

コサイン類似度はベクトル間の向きの近さを示す指標として良く使われ、AIの世界でもベクトル同士がどの程度近くにあるのか調べたいことが多々あるので用いられています。

ただ内容的には高校数学なのでとても簡単です。

内積について

まずは2次元ベクトル  \boldsymbol{a} \boldsymbol{b} の内積は以下の式で定義されています。

 \boldsymbol{a}・\boldsymbol{b}=| \boldsymbol{a}|| \boldsymbol{b}|cosθ

f:id:hanaaaaaachiru:20200327143436p:plain


言葉にして表すと「ベクトル \boldsymbol{a}の長さと、ベクトル \boldsymbol{b}のベクトル  \boldsymbol{a}と同じ向きの成分の長さをかけたもの」です。

これのどこがベクトル間の向きの近さを示すかというと、θと内積の関係が以下のようになっています。

θの値 ベクトル \boldsymbol{a} \boldsymbol{b}の関係 内積の値
向きが完全に一致 最大値
90° 直行している 0
180° 逆向き 最小値


2つの2次元ベクトルを以下の成分で表し、式変形をするとこんな形にすることができます。
 \boldsymbol{a}=(a_1, a_2)
 \boldsymbol{b}=(b_1, b_2)

 cosθ=\dfrac{a_1b_1+a_2b_2}{\sqrt{a_1^2+a_2^2}\sqrt{b_1^2+b_2^2}}

コサイン類似度

この公式をn次元に拡張したものがコサイン類似度です。

もし50次元みたいな世界があったとして、実際にベクトルがどんな形をしているかは想像することもできませんが、 cosθが求められるのだけは確かです。

 cosθ=\dfrac{a_1b_1+a_2b_2+...+a_nb_n}{\sqrt{a_1^2+a_2^2+...+a_n^2}\sqrt{b_1^2+b_2^2+...+b_n^2}} = \dfrac{\sum_{k=1}^n a_kb_k}{\sqrt{\sum_{k=1}^n a_k^2}\sqrt{\sum_{k=1}^n b_k^2}}


この式により求めた cosθが1に近ければ2つのn次元ベクトルは向きが近いということが分かります。

さいごに

最初にコサイン類似度の公式だけをみるとギクっとしますが、内積の変形・拡張したものだと思えばそれほど難しくはない気がします。

もし機械学習などに興味がある方は覚えておくと良いかもしれませんね。

ではまた。

参考