プログラマでありたい

おっさんになっても、プログラマでありつづけたい

リコメンドエンジンを作る 集合知プログラミング 

集合知プログラミング 2章 推薦を行う


 協調フィルタリングの作り方。所謂レコメンドエンジンの作り方です。色々間違っている部分ありそうですが、自分の学習したことをつらつらと書いていきます。
1.嗜好の収集
 利用者の行動を収集します。オンラインショッピングであれば、買った、閲覧した、買わなかった等です。例として映画の嗜好で作っています。縦軸がぽにょで、横軸がインディージョーンズです。それぞれ0〜10でポイントをつけて、0が好きではない、10が好きです。

hanako 1 9
ichiro 2 6
tom 5 5
taro 10 0

2.似ているユーザを探し出す
 1のデータを元にユーザの類似性スコアを算出します。この方法は色々ありますが、ユークリッド距離、ピアソン相関、Jaccard係数、マンハッタン距離などがあるようです。

ユークリッド距離の場合

 それぞれの軸上での差をとり、それぞれを乗じて足してた合計の平方根を使います。

ichiroは、(ぽにょ,インディー)=(2,6)。tomは、(ぽにょ,インディー)=(5,5)です。二人の距離は、以下のように求められます。値は0〜1の間をとり、1に近いほど嗜好が近いことを表します。

#ポニョ好き
$x=(5-2)**2;
#インディージョーンズ好き
$y=(6-5)**2;
#両者の距離
$s=1/(1+sqrt($x+$y));
print $s,"\n";

0.240253073352042

ピアソン相関係数の場合

 もう少し洗練された方法として、ピアソン相関係数を用いて計算することが出来ます。ピアソン相関係数のメリットは、評者の点数の付け方の傾向を吸収してくれます。たとえば、Aさんは、ぽにょをAさんの中での最高評価8を、インディーを最低評価2を付けました。Bさんは、ぽにょを最高の10でインディーを最低の0を付けました。ユークリッド距離では、両者の嗜好はズレていると出てきます。これに対してピアソン相関関数は直線の傾きで評価するため、ほぼ一致します。
 計算の仕方は、両方の評者が得点を付けているアイテムを探しだします。そして、評者の評点の合計と、評点の平方の合計を算出します。そして評価をかけ合わせた値の合計を算出します。それを下記の数式に入れます。¥

※続きます