這是有問題的功能。它計算p1和p2的Pearson相關係數,它應該是-1和1之間的一個數字。從「編程集體智慧」這個Python函數有什麼問題?
當我將此用於實際用戶數據時,它有時會返回大於1的數字,如本例中:
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,
}
}
print sim_pearson(critics, 'user1', 'user2',)
1.15470053838
好吧,如果它是關於整數與真正的除法,那麼請注意這個問題已經在Py3k中解決了---'/'總是真正的除法(並且正如你所看到的!)。 – 2009-09-14 20:13:57