協調フィルタリングのメモ
レコメンドエンジンを作りたくなったので、協調フィルタリングについて簡単に調べました。今回はメモリベースの協調フィルタリングにのみ言及します。数学的な式などは省いており、概念的なメモだけです。
参考リンク:
http://japan.zdnet.com/web/sp_08ec/20375385/
http://d.hatena.ne.jp/EulerDijkstra/20130407/1365349866
http://www.kamishima.net/archive/recsysdoc.pdf
協調フィルタリングとは
ユーザーの行動履歴からレコメンド内容を決める手法。
ユーザーの行動履歴のみからレコメンドを行えるのでアイテムの詳細情報を事前インプットしておく必要がない。そのため人が想定しないレコメンドができ、また半自動化ができる。
ユーザーベース協調フィルタリングとアイテムベース協調フィルタリングに分類される。
ユーザーベース協調フィルタリング
ユーザーの行動履歴を基に類似ユーザーを判定し、類似ユーザーがチェックしたアイテムをレコメンドする。
アイテムベース協調フィルタリング
ユーザーの行動履歴を基に類似アイテムを判定し、レコメンドする。
ユーザーベース協調フィルタリングには以下の欠点があるため、アイテムベース協調フィルタリングの方が用いられるケースは多い。(たぶん)
ユーザーベース協調フィルタリングの主な欠点
- ユーザーが1人増えるごとにユーザー数ぶんの類似度計算を行う必要があり、処理が重くなる (アイテムベースの場合は事前にアイテム同士の類似度計算を行っておく事で処理を軽くできる)
- 対象となるユーザーの履歴が溜まっていない場合にレコメンドができない
- アイテムベースと比較して外れ値に影響されやすい。
類似度計算の代表的手法
- ユークリッド距離
- ピアソン相関係数(相関を取るのでデータが正規化されていない場合に有効)
- コサイン類似性(アイテムベース類似性で良く使われる)
アイテムベースにしてもユーザーベースにしてもデータ量は非常に大きくなるので、類似度計算は最大のボトルネックになる。
レコメンドの精度を上げるために
以下の工夫が代表的。どんなサービスかによって細かいチューニングの方法は変わる。