Programming Collective Intelligence#4
間を空けすぎて、前にどこまでやったか覚えてないや・・・Item-Basedか。
そうだそうだ。
Item based filtering
今までやってきたUser based filteringは
- User数が増えると計算量がだーい爆発
- Item数が増えると今度はオーバラップが少なく User間の関係が希薄になる=本当に意味のある集計ができない
じゃあもう少し絞り込みましょう、となって、でも実は難しくも何ともなく、前計算で事前にある程度グルーピングをしちゃいましょう、というよくある手法。
前計算では各itemについてuserの評価値を特徴ベクトルとして「似た者」を抽出する。これは頻繁にはかわらない情報。なので一度計算しておけばしばらくはそのままで良い=各クエリに対するユーザへのレスポンスは速く見せかけられる。前計算の手続きは
- 評価行列(Preference Matrix)を転置して item-matching(本書では Product Matchingと呼んでいる)の準備をする。
- すべての itemに対して topMatch を辞書 ItemMatchに格納しておく。
と本当に単純。topMatchの数(n)はこの前計算関数に引数で指定する(sampleコードでのデフォルトは10)。
で、本番:「指定したユーザーに推奨するitemを出せ」という問題に対して以下のように辞書 ItemMatchを利用して計算する。
- 指定したユーザーの評価済みitem(=item_user)を順に見ていく
- 各item_userに対して、辞書ItemMatchを調べる→item_userと良く似た評価がされているitemを取得(=item_similar)。
- そのitemそれぞれについてスコアを更新
ということをやって、最後に正規化すればできあがり。考えてみれば当たり前の方法であんまり感動できない気もする。
実際にこのアルゴリズムでやる為には ItemMatchの更新タイミングというのを綿密に設計する必要があり(まあ、非同期で更新しても良いので、案外いい加減でも良いのかもしれないけれども)、そっちまで考えると面白い問題なのかもしれにあ。
Using the MovieLens Dataset
例によって例題。 GroupLensプロジェクトとか言うのがミネソタ大学で行われていたらしく。
http://www.grouplens.org/node/12 からダウンロードできる。..
と書いてあるんだけど現在はMovieLensだけは
http://www.movielens.org/
に移動してるっぽい。登録面倒だったのでやってない。全部読み終わって気が向いたらやるかも。
User-Based or Item-Based Filtering
Item-based
- 速い
- 疎なデータセットでもかなり正確(の基準がわからない)
- でも前計算が重い
- 辞書のメモリ食い
User-based
- 単純、わかりやすい
- 前計算なんてマンドクサイことしなくて良い :頻繁に変更されうるデータセットではこちらが良い
- 密なデータセットならまあまあItem-basedとおんなじくらい正しいっぽい
- おっそい。
http://citeseer.ist.psu.edu/sarwar01itembased.html
暇な気分になったら読む。
Exercise
1. Tanimoto score
2. Tag similarity
3. User-based Efficiency
4. Item-based bookmark filtering.
5. Audioscrobbler.