レコメンデーションの簡単な原理を視覚的に把握してから実際に計算してみる

Mahoutシリーズを最初から読む場合はこちらApache Mahoutで機械学習してみるべ - 都元ダイスケ IT-PRESS。

昨日分析したデータは、1番の人にお勧めなアイテムは104で、4.25点をつけるだろう、という予想でした。なぜこのような計算結果になったのか、なんとなく感覚をつかんでみよう。

入力に使ったCSVデータを、簡単にグラフ化してみたのがこれだ。

レコメンド対象となる1番の人は、青のグラフだ。この青のグラフのパターンに一番似ているのはどれだろう? 101〜103をぱっと見た感じ、紫(5)の人と似た傾斜だと感じると思う。また、赤(4)の人も分かりづらいけど結構似ている。102の評価は抜けているものの、101*1と103の評価は近い。

逆に、緑(2)の人とは正反対の好みを持っているようだ。グラフが逆行している。黄色(3)の人は…、あんまり関連性はなさそうだな。

というようなことを考えると、104〜107のアイテムに「何点つけそうか?」が計算できる。紫と赤の人の傾向と似てるわけだから、青の人だって同じように104に高得点をつけそうだ。また、緑の人とは逆の好みを持っているのだから、緑の人が104を酷評しているので、やはり青の人にとっては高得点に思えるであろう。というわけだ。

さて、もう少し数学的にしてみよう。もう少しだけ。

ある二人のグラフのパターンがどの程度似ているのか? というのを数値化できる。この数値化の式は少々複雑なので説明しないけど。これを相関係数と言うのだが、「全く関連性がない状態」を0、「完全に一致」を1とします。さらに、「逆の関連を持つ」つまり緑の人は相関係数がマイナスとなる。最小値は-1で、完全に逆相関。この値を-1〜1の実数として扱う。

昨日のデータの相関係数は以下の通り。目分量で考察した結果と一致しているのが分かると思います。

1 vs 1 = 1.0
1 vs 2 = -0.7642652566278799
1 vs 3 = NaN
1 vs 4 = 0.9999999999999998
1 vs 5 = 0.944911182523068

この情報を表すのが UserSimilarity ですね。ちなみに、自分自身と比較したら完全一致ですから1.0です。そして3は共通した評価が101しかないので、相関係数を計算できなかった感じです。

次に、これらを相関係数(の絶対値)順に並べ、「特に似ている人」を二人*2選び出します。まぁ、4と5の人ですね。この「似ている人たち」を表すのが UserNeighborhood です。

で、4と5の人を参考にして1の人に対してレコメンドするので、ここでレコメンド候補アイテムが絞り込めます。4または5が評価していて、かつ、1が評価していないアイテムを選び出します。その結果 104, 105, 106 となります。

104のアイテムについては、以下のように評点と相関係数、及びその積をまとめました。

user pref 相関係数 pref×相関
4 4.5 0.99 4.50
5 4.0 0.94 3.78
計 - 1.94 8.28

これをこのように割ると 8.28 ÷ 1.94 ≒ 4.26 です。104の予測評点は約4.26となりました。この計算はいわゆる加重平均です。重み=相関係数ですね。

他のアイテムについても同様の計算をした結果、一番予測評点が高かった104をお薦めした、というわけです。

これが、レコメンドの簡単な原理です。

*1:青グラフの■の裏に、赤の■が隠れている。表の方で確認すれば分かる。

*2:NearestNUserNeighborhoodのコンストラクタ第一引数に指定した値