あなたが買ったものはBさんも買っています。Bさんが買った他の商品Xはいかがでしょうか?
こうした事をAmazonではよく見かけます。これは推薦エンジンとよばれており、もっと一般的には協調フィルタリングなんて呼ばれたりします。
協調フィルタリング(collaborative filtering)による推薦システムの作り方は意外と簡単です。どうやったらできるのか、その方法を説明します。
アイテムベース
アイテムベースの推薦です。アイテムベースとは、以下のようなことです。
- Aさんが好きなアイテムXがあるとする。
- アイテムXと似ているアイテム順に列挙する
つまり、特定のアイテムと似ているアイテムを探します。コレ以外の方補でユーザーベースのがあります。どちらも一長一短がありますが、アイテムが少ない場合にはアイテムベースを用いるといいでしょう。
推薦システム(アイテムベース)
データベースの構造は以下のようになっていると仮定します。
・ pref[ アイテム名 ][ ユーザ名 ] = 類似度
例) ドメストとサンポールの類似度
斎藤、加藤、古澤、田中がドメストとサンポールをそれぞれ評価します。
pref[ 'ドメスト' ] = { ‘斉藤’: 10.29, ‘加藤’: 8.72, ‘古澤’: 7.78 } pref[ 'サンポール' ] = { ‘斉藤’: 5.29, ‘加藤’: 5.21, ‘田中: 4.9 }
使っていないユーザーは評価できないので、上のリストには入っていません。上記から「サンポール」と「ドメスト」がどれだけ似ているか判断するにはどうすればいいでしょうか。それは同じ要素に注目するのです。サンポールとドメスト両方を評価しているものに注目すると、斉藤と加藤のみです。(古澤はドメストのみ、田中はサンポールのみ)
アイテムベースで類似度を図るには、共通している項目(斉藤と加藤の評価点)のみに注目します。なお、類似度の算出にはよくピアソン相関が用いられます。出た類似度を用いて推薦システムは構築されます。中にはコサイン積を用いる方法もありますが、単純なベクトルの内積値(コサイン積)よりも、ピアソン相関を好むケースが多く見られます。
共分散を σXY, 標準偏差をσX, σY とおく。このとき{\displaystyle \rho ={\frac {\sigma {XY}}{\sigma {X}\sigma {Y}}}} として書くことができます。以下も全く同じですが、少し具体的に書きます。
r_{xy} = \frac{{\displaystyle \sum_{i = 1}^n (x_i - \overline{x})(y_i - \overline{y})}}{\sqrt{{\displaystyle \sum_{i = 1}^n (x_i - \overline{x})^2}} \sqrt{{\displaystyle \sum_{i = 1}^n (y_i - \overline{y})^2}}} = \frac{s_{xy}}{s_xs_y}アイテムベースでは一回類似度マトリックスを用意してけば、そのマトリックスのうち、類似度が高いものを返すだけでいいのでとても楽です。
ユーザベース
ユーザベースでは、アイテムベースとは逆の以下のようなデータ構造を用意します。pref[ ユーザ名 ][ アイテム名 ]
pref[ '斉藤' ] = {‘風と共にさりぬ’:3, ‘タイタニック’:2, “冷静と情熱の間':4, “セブン”:2} pref[ '田中' ] = {‘風と共にさりぬ’:2, ‘タイタニック’:5, “アルマゲドン':1}
映画、「タイタニック」を見ていない人がいたとして、一体自分はどう評価するかをしりたいのです。
こちらも簡単で、手順は以下のとおりです
- 見ている物同士のアイテムをピアソン相関を用いて類似度を算出する。
- 自分のタイタニックの評価 = ( 田中との類似度 x タイタニック[ 田中 ] + 斉藤との類似度xタイタニック[ 斉藤 ] ) / (斉藤の類似度+ 田中の類似度)
これが最終的な結果です。類似度の加重平均であるということがわかります。