transformPrefsでスコアのディクショナリをアイテムごとのディクショナリに変換して
アイテムごとにループを回して各アイテムに似ているアイテムをランキングでとってくる
各ユーザーの評価で映画のタイトルのスコアに重みづけをしてアイテムベースでユーザーにオススメをする
MovieLensのデータ・セットを使って商品の推薦を行います。
まず、loadMovieLens関数でMovieLensのデータをロードします。そして、getRecommendations関数を使ってユーザーベースの推薦を行い、
calculateSimilarItems関数を使ってアイテム間の相関を計算し、getRecommendedItems関数でアイテムベースの推薦を行います。
とここまで「集合知プログラミング」の2章をPHPで書きなおして来たわけですが、
実際にアイテムベースで推薦を行う場合のロジックはどのようなものなのでしょうか?
まず、アイテムベースの推薦で使っている関数は
calculateSimilarItems
transformPrefs
topMatches
sim_peason( or sim_distance)
でやっていることといえば
まず、ユーザーごとの各アイテムの評価のarrayをアイテムごとのユーザーによる評価のarrayに変換しています。
つまり、arrayの第一連想配列のキーはアイテム名で、第二連想配列のキーは評価者となります。
そして、sim_peasonを使ってアイテム間の相関スコアを取得します。
そのアイテムスコアを使ってtopMaches関数で各アイテムごとに、相関スコアが高い順にアイテムをランキング付けします。
たとえば、Superman Returnsに一番相関が高いのはYou Me and Dupreeでスコアは0.657
二番目に高いのはLady in the Waterでスコアは0.487といった具合です。
ここまでで、どのアイテムとどのアイテムが似ているのかがわかるようになったわけです。
最後にユーザーに対して推薦を行う場合は
ユーザーが既に評価した(購入した)アイテムとまだ購入していないアイテムの相関スコアに対して
評価したアイテムの評価で重み付けを行い、まだ購入していないアイテムそれぞれの推薦度スコアを計算します
そして推薦度スコアがもっとも高いものをユーザーに推薦します。
この章では一旦、ユーザーベースの推薦を行ったあとに、そのロジックを逆転させてアイテムベースの推薦を行っているので
どういうロジックでアイテムベースの推薦を行っているのかを理解するのがすこし難しいですね
2013年7月13日土曜日
PHPで学ぶ「集合知プログラミング」〜推薦を行う〜 2
2013年7月12日金曜日
PHPで学ぶ「集合知プログラミング」〜推薦を行う〜 1
「集合知プログラミング」
買いました!
データのシミュレーションや分析には興味があったので
といっても
ただ、エクセルで表とかグラフとか作るだけじゃつまんない
エンジニアとして
どや!!って言える仕事がしたい
なので、集合知プログラミングでエンジニアっぽい分析を習得しようと思います
この集合知プログラミングはPythonで書かれております。
僕は主にPHPを使って開発をしていますし
というか、PHPしかつかってないし。。
ただ単にPythonを写経するだけだと何にも身につかないと思うので
サンプルコードをPHPで書き直しながら進めていきたいと思っています。
まずはデータ・セットの作成
二人の評価者のユークリッド距離によるスコアを算出するsim_distanceとピアソン相関によるスコアを算出するsim_peasonを定義
リストの中から最も好みの似ている評価者を選び出すtopMatchesを定義。
var_dump($result)でTobyに似ているユーザーをarrayで返してくれる
評価者に重み付けを行い(自身とどの程度好みが似ているか)
その重みづけスコアと書く評価者の評価点を掛けあわせて映画のタイトルごとにスコアを算出する
もっともスコアの高い映画が、対象とするユーザーにオススメの映画となる
今まで用いてきた評価者ごとの映画の評価配列を映画ごとの評価配列に変換する
以前に定義したtopMatches関数を使って、似た属性をもつ映画をランキング形式で表示できる。
また、映画が誰に見られるべきかをgetRecommendationsを使って表示することができる
登録:
投稿 (Atom)