Programming Collective Intelligence#2

前回:似たもの同志がわかった!(topMatch()) →「そうそう目的は「おすすめムービー」だった」まで

  • topMatch()の結果をそのまま使うのは、ちょっと…
    • 本来なら良い評価になるはずの映画を
      • たまたまtopMatchな人がその映画を見てなかったり
      • たまたまtopMatchな人がその映画に限って変な評価をしてたり
  • そこで重み付けスコア
    • 評価値を類似度で重み付けして全ユーザについて総和をとる
    • そのままだと評価数が多い映画が有利になってしまうので類似度の合計で割って正規化

と、書いてあるんだけど、どうも納得いかない。
例えば

user sim ItemA x sim ItemB x sim
A 0.1 1 0.1
B 0.1 8 0.8
C 1.0 3 3.0
D 1.0 4 4.0
7.0 0.9
正規化 3.5 4.5

ということ? 折角類似度 0.1で軽視したはずの A,B が生きてしまう気が。普通に平均じゃダメ?なんか勘違いしてるんだろうな、と思うと同時にtypoとか一貫性のなさとかこの本自体結構suspiciousだったり…

c2={'A': {'ItemB':1.0}, 'B': {'ItemB':8.0},
    'C': {'ItemA':3.0}, 'D': {'ItemA':4.0}, 'E':{}}

def sim_silly(prefs, person1, person2):
  if person2 == 'C' or person2 == 'D':
    return 1.0
  else:
    return 0.1

とかして

>>> recommendations.getRecommendations(recommendations.c2, 'E', recommendations.sim_silly)
[(4.5, 'ItemB'), (3.5, 'ItemA')]

あれれやっぱり。いいのかなこれで。