アイテムベースの推薦アルゴリズム「Slope One」
今回は比較的シンプルなアイテムベースの推薦アルゴリズムながら、比較的良い推薦精度を示すSlope One予測について説明します。 概要を説明して、数式での説明を加えて、Pythonで実装するという流れで進めます。
Slope One予測とは
Slope One予測の考えとしては、ユーザーのアイテムに対する「人気度の差異」に基づいています。
Slope One予測は、2組のアイテムに対してあるアイテムの評価値を別のアイテムの評価値から予測するための関数を見つけるという考えに基づいて、 未知の評価値を算出します。 具体的には、ここのユーザーのアイテム評価値間の差分を算出し、全ユーザーについて算出されたアイテム評価値間差分の平均値を算出し、この算出結果を基に結果を算出していきます。
Slope One 予測の定式化
シンプルなSlope One予測の定式化
Slope One予測は以下のように定式化できます。
- アイテム間での平均偏差を求めます。
通常評価値データベース全体をで示し、あるユーザーの評価値は不完全な配列で構成されます。 はのアイテムに対する評価値(つまりあるユーザーのアイテムに対する評価値)です。 はアイテムとを両方評価したユーザーの集合の要素数を表現しています。
- 共に評価付されたアイテムの平均値を計算します。
関数はユーザーによってと共に少なくとも1回は評価されたアイテムと定義します。
重み付けしたSlope One予測の定式化
直感的には、1人よりも10人のユーザーと行ったようにより多くのユーザーの評価値を基に算出したほうが、信頼性の高い予測になると考えられます。 そこで個々の偏差の重みを共に評価された回数として、重み付けを行うことを考えます。
Pythonでの実装
以下のような、評価値データベースを考えます。
item1 | item2 | item3 | |
---|---|---|---|
alice | 2 | 5 | |
user1 | 3 | 2 | 5 |
user2 | 4 | 3 |
この評価値データベースでaliceのitem3の評価値を予測することを目的とします。 今回は、上で示した重み付けをしたSlope One予測で評価値を予測します。
この例では、
共に評価されている回数が2回であるitem1とitem3があります。 user1においては、item3に対してitem1よりも2ポイント高い評価付けをしています。() user2においては、item3に対してitem1よりも1ポイント低い評価付をしています。() よって、これらの平均距離は、です。
共に評価されている回数が1であるitem2とitem3があります。 user1においては、item3に対してitem2よりも3ポイント高い評価付けをしています。() よって、これらの平均距離は、です。
総合的な予測値は、共に評価された回数を考慮に入れるため、重み付けをして計算します。
これをPythonで実装したコードを以下に示します。
import numpy as np arr = np.array([[2, 5, np.nan], [3, 2, 5], [4, np.nan, 3]]) target_user_index = 0 target_item_index = 2 exist_rat_target = np.flatnonzero(~np.isnan(arr[:, target_item_index])) top_value = 0 bottom_value = 0 for idx in range(arr.shape[1]): if idx != target_item_index: comp_arr = arr[:, target_item_index][exist_rat_target] - arr[:, idx][exist_rat_target] rat_cnt = np.count_nonzero(~np.isnan(arr[:, idx][exist_rat_target])) target_user_rat = arr[target_user_index, idx] top_value += rat_cnt * (target_user_rat + np.nansum(comp_arr) / rat_cnt) bottom_value += rat_cnt print('alice rating of item3: {:.2f}'.format(top_value / bottom_value))
まとめ
Slope One予測はかなり直感的でわかりやすいにも関わらず、一般的なユーザーベースやアイテムベースよりも比較的良い精度をだすみたいです(もう少しサーベイは必要だとは思いますが・・・)。 今度はMovieLensのデータセットで精度評価をしてみたいですね。 気が向けば追記します。
- 作者: Dietmar Jannach,Markus Zanker,Alexander Felfernig,Gerhard Friedrich,田中克己,角谷和俊
- 出版社/メーカー: 共立出版
- 発売日: 2012/06/22
- メディア: 単行本
- 購入: 1人 クリック: 15回
- この商品を含むブログ (1件) を見る