【レコメンドの仕組みってどうなってるの?】〜ユークリッド距離編〜

何の記事??

リコメンドに使えそうな知識を調べていくうちにまとめたくなりました。まずは、最も簡単なユークリッド距離編です。

Amazon や楽天などの EC では当たり前になっているリコメンドですが、実際自分で実装しようとした時に、どんな手法があるのかを調べたのでまとめます。
数学の知識って本当に大事ですね・・・点Pが動くとか一緒に家を出ない兄弟の問題とかバカにしてたけど、きっちりやっておけば良かった笑


協調フィルタリング

例えば、あなたが何か映画やドラマを探す時一番簡単な方法は、自分と気があう友達や同僚に聞くのが一番かと思います。
おそらくその友達はあなたの興味や趣味、嗜好を把握した上で提案してくれるでしょう。

しかし、一人でネットショッピングをしている時ネットに話しかけても誰も答えてくれません。(一人でパソコンに話していたら危ない人ですね

そこでプログラムとデータで解決する方法が

協調フィルタリング

です。

協調フィルタリングのアルゴリズムは、多くの人々の集団を検索して対象の人の好みに似た集団を発見します。

また、その集団の人々の好み、趣味・趣向を組み合わせリコメンドを作成します。


似ているユーザを探し出す

それでは、どのように好みの似た集団を探し出すのか?

何を持って似ている似ていないの優劣をつけるのかという問題にぶち当たります。

 

それには、当人とそれ以外のユーザを全て比較して、どの程度似ているかという指標を表す

類似度

を使用します。

 

今回は

「ユークリッド距離」

を見ていきましょう!!


ユークリッド距離

まず一つ目のユークリッド距離です!!

 

例を一個あげましょう。

Rock と Classic 音楽の好き度合いを、John, Pat, Billy, Paul にしてもらいました。

(なんで Eric とか Martin じゃなくて John なんだ!!と気づいた方は MR.BIG ファンですね笑)

f:id:shaw522:20190331230425j:plain

念のために解説を・・・

John はクラシック音楽を 1.3 , ロックを 4.1 と評価しています。クラシックより音楽が好きなようですね。

一方の Pat は、クラシック音楽を4.2、ロックを4.5 と評価しているので、どちらも好きなようです。

音楽の記事も書きたいな・・・←雑記にも程がある!!!

 

さて気を取り直して・・・

ユークリッド距離っていうと難しく聞こえますが、単純な距離です。

それぞれ x, y 軸の座標点の差を取り、それを2乗して足し合わせます。その合計の平方根を取ることでユークリッド距離を取得できます・・・

という説明よりコードの方がわかりやすい!!という方もいますよねヾ(´▽*)ゝ

 

>> from math import sqrt
>> sqrt(pow(x座標① - x座標②, 2) + pow(y座標① - y座標②))

python を選びました。

psqrt 関数は、平方根を取得する関数ですね。

一方、pow は n乗を返してくれます。nは第二引数ですね。

 

それでは距離を出してみましょう。

John-Billy : sqrt(pow(1.3-2.6,2) + pow(4.1-1.8,2)) => 2.6419689627245813

 

こんな感じですね。
この距離が小さいほど似ているということになります。
スコアという意味では、数値が高い方が似ているとした方がわかりやすいので、結果に1を加え逆数を取りましょう。
これで、1に近いほど似ているということになります。

1/(1+sqrt(pow(1.3-2.6,2) + pow(4.1-1.8,2))) => 0.2745767496194952

こうなりますね。
それではそれぞれのスコアを出していきましょう。

  • John-Billy : 1/(1+sqrt(pow(1.3-2.6,2) + pow(4.1-1.8,2))) => 0.2745767496194952
  • John-Pat : 1/(1+sqrt(pow(1.3-4.2,2) + pow(4.1-4.5,2))) => 0.25461773231980045
  • John-Paul : 1/(1+sqrt(pow(1.3-4.8,2) + pow(4.1-1.3,2))) => 0.1824089557990044
  • Billy-Pat : 1/(1+sqrt(pow(2.6-4.2,2) + pow(1.8-4.5,2))) => 0.24163513732147376
  • Billy-Paul : 1/(1+sqrt(pow(2.6-4.8,2) + pow(1.8-1.3,2))) => 0.30711560746594024
  • Pat-Paul : 1/(1+sqrt(pow(4.2-4.8,2) + pow(4.5-1.3,2))) => 0.23497542908541053

となりました。
これを見る限りは Billy と Paul が一番近いようですね。

 

例が悪かった・・・泣

ということで、僕だったらおそらくクラシック音楽 3.8、ロック 4.4 くらいでつけると思います。
計算してみると僕は Pat と 0.708059563178595 とかなり高い数字が出ますね。

 

みなさんも友達や家族の誰と好みが近いのか調べてみてくださいね。


最後に

次回は、ピアソン相関について説明していきます。
今回紹介したユークリッド距離は本当に単純なものです。

導入程度に参考にしてみてください。

自分でリコメンドってどうなっているのかなぁ〜と考えることがものすごく楽しいですね。

個人的に一番わかりやすい本はこちらです!!

 

集合知プログラミング

集合知プログラミング

 

 

 

それではまた次回〜