この関数は「Programming Collective Intelligence」の書籍であり、p1とp2のピアソン相関係数を計算し、-1と1の間の数値とします。「Programming Collective Intelligence」のピアソンアルゴリズムの問題点は何ですか?
2つの批評家評価項目非常に同様の機能は、私は時々奇妙な結果を得る1を返し、または実際のユーザー・データと1
に近いすべき次の例では、データセットのcritics2は1を返す必要があります - 。代わりに、それは0
は誰のスポットをい返します間違い?
(ThはWhat is wrong with this python function from “Programming Collective Intelligence”の複製ではありません)
from __future__ import division
from math import sqrt
def sim_pearson(prefs,p1,p2):
si={}
for item in prefs[p1]:
if item in prefs[p2]: si[item]=1
if len(si)==0: return 0
n=len(si)
sum1=sum([prefs[p1][it] for it in si])
sum2=sum([prefs[p2][it] for it in si])
sum1Sq=sum([pow(prefs[p1][it],2) for it in si])
sum2Sq=sum([pow(prefs[p2][it],2) for it in si])
pSum=sum([prefs[p1][it]*prefs[p2][it] for it in si])
num=pSum-(sum1*sum2/n)
den=sqrt((sum1Sq-pow(sum1,2)/n)*(sum2Sq-pow(sum2,2)/n))
if den==0: return 0
r=num/den
return r
critics = {
'user1':{
'item1': 3,
'item2': 5,
'item3': 5,
},
'user2':{
'item1': 4,
'item2': 5,
'item3': 5,
}
}
critics2 = {
'user1':{
'item1': 5,
'item2': 5,
'item3': 5,
},
'user2':{
'item1': 5,
'item2': 5,
'item3': 5,
}
}
critics3 = {
'user1':{
'item1': 1,
'item2': 3,
'item3': 5,
},
'user2':{
'item1': 5,
'item2': 3,
'item3': 1,
}
}
print sim_pearson(critics, 'user1', 'user2',)
result: 1.0 (expected)
print sim_pearson(critics2, 'user1', 'user2',)
result: 0 (unexpected)
print sim_pearson(critics3, 'user1', 'user2',)
result: -1 (expected)