推薦システム(レコメンドエンジン)の作成法

あなたが買ったものは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タイタニック[ 斉藤 ] ) / (斉藤の類似度+ 田中の類似度)

これが最終的な結果です。類似度の加重平均であるということがわかります。

参考文献

https://www.amazon.co.jp/%E9%9B%86%E5%90%88%E7%9F%A5%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-Toby-Segaran/dp/4873113644

おすすめページ

投稿者: 等々力 康弘

画像処理エンジニア。組み込みソフト出身。 株式会社モルフォにてR&D部門、主に機械学習業務に携わり、顔認識&顔検出のアルゴリズム開発に従事。国内特許数件、国際特許1件。 モルフォ社退社後、株式会社Dynaptico創業(CEO)。アメリカ人、スウェーデン人と3名とフードデリバリーサイトmaishoku.comを立ち上げる。社長業の他、開発業務においてバックグラウンド関連全般(Djangoを用いいたバックエンドサーバ&APIサーバーの作成、 リバースプロキシなどの負荷分散サーバ関連、OCRプログラムの作成、CISCOルータの管理, 、seleniumを用いたテストサーバーの構築、Androidアプリの開発等々)に携わる。 2019年DynapticoのCEOを辞職。 2020年2月にComputer Scienceに特化した株式会社OctOpt創業。 OSはUbuntu。Appleが苦手。Swiftのバージョンアップ対応とか死ぬほど嫌い。 Python/C++/C Twitter: @rocky_house シフト自動調整スケジュールサイトをVue.js+graphene djangoで構築. https://www.allshifter.com

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です