Re:ゼロから始めるML生活

どちらかといえばエミリア派です

recsys-pythonをやる (第5章 ユーザベース協調フィルタリング・第6章 アイテムベース協調フィルタリング)

この記事は (1人で)基礎から学ぶ推薦システム Advent Calendar 2022の3日目の記事です。

前回に引き続きrecsys-pythonをやっていきます。

www.nogawanogawa.com

前回は4章までだったので、今回は5章からやっていきたいと思います。

第5章 ユーザベース協調フィルタリング

考え方 : ユーザーは似たユーザーが高評価したアイテムを好む

前回の類似度に基づく推薦ではあくまでアイテムとアイテムの類似度を用いて推薦を考えました。

ユーザーベースでの協調フィルタリングでは、ユーザーとユーザーの類似度を用いることで「ユーザーは似たユーザーが高評価したアイテムを好む」を算出することができました。

ピアソンの相関係数による"ユーザーの類似度"

協調フィルタリングにおいて、ユーザー同士の類似性の算出にはピアソンの相関係数がよく使われます。

式としては下記のように計算されます。

\displaystyle{
sim(i, l) = \frac{\sum_{j \in J_{il} }( y_{ij} - \bar{y_{i}}) (y_{lj} - \bar{y_{l}})} {\sqrt{\sum_{j \in J_{il} }( y_{ij} - \bar{y_{i}})^{2}} \sqrt{ \sum_{j \in J_{il} }(y_{lj} - \bar{y_{l}})^{2}}}
}

このユーザーi, jの類似度は、値が大きいほど類似していると考えることができます。

いま得られたユーザーiに類似したユーザーの行動をもとに、なんのアイテムがオススメなのかを考えます。


\displaystyle{
s_{i,j} = \bar{y_{i}} + \frac{\sum_{l \in I_{j} (i)} w(i, l) (y_{lj} - \bar{y_{l}})}{ \sum_{l \in I_{j} (i)} |w(i, l)| }
}

それぞれの変数は

  •  s_{i,j} : 推定レイティング(ユーザーがどれくらいそのアイテムが好きそうか)
  •  y_{ij} : ユーザーiがアイテムjに与えるレイティング
  •  \bar{y_{i}} : ユーザーiの平均レイティング
  •  I_{j} (i) : アイテムjを評価したユーザーiに類似するユーザーの集合
  •  w(i, l) : ユーザーiがアイテムjを評価する際のユーザーlの評価に対する重み

を表しています。

式で書くとちょっとややこしいですが、要するに「ユーザーは似たユーザーが高評価したアイテムを好む」と仮定して、「似たユーザーが高評価したアイテム」に高評価を推定するようなアルゴリズムになります。

やってみる

recsyslab.github.io

第6章 アイテムベース協調フィルタリング

考え方 : 自分と同じようなアイテムを好むユーザーが高評価したアイテムは自分も好むだろう

基本的な考え方はユーザーベース協調フィルタリングと似ています。

違うのは、類似度を計算するのがユーザーベース協調フィルタリングでは”似たユーザー”であったのに対し、アイテムベース協調フィルタリングでは"似たアイテム"である点です。

これを使用すると、「ユーザーは似たアイテムを好む」といった仮定のもと、推薦を行うことができます。 類似性の算出には、ユーザーとアイテムの考え方を反転させたピアソンの相関係数が使用できるので、あとはそのまま適用するだけですね。

前回の類似度に基づく推薦と異なる点としては、前回は特徴空間を使用して類似度を考えましたが、アイテムベースの協調フィルタリングではユーザーの評価値を使用して類似度を算出している点が異なります。

やってみる

recsyslab.github.io

参考文献

下記の文献を参考にさせていただきました。

感想

協調フィルタリングぐらいまでいくと、もう"推薦"って感じがしてきますね。 基本と言えど、奥が深いところではありますね。