Hob*_*use 4 python algorithm pearson
这是有问题的功能.它计算p1和p2的Pearson相关系数,它应该是介于-1和1之间的数字.
当我将它与真实用户数据一起使用时,它有时会返回一个大于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
Run Code Online (Sandbox Code Playgroud)
看起来你可能会出乎意料地使用整数除法.我做了以下更改,并返回了您的函数1.0:
num=pSum-(1.0*sum1*sum2/n)
den=sqrt((sum1Sq-1.0*pow(sum1,2)/n)*(sum2Sq-1.0*pow(sum2,2)/n))
Run Code Online (Sandbox Code Playgroud)
有关Python中除法运算符的更多信息,请参见PEP 238.修复上述代码的另一种方法是:
from __future__ import division
Run Code Online (Sandbox Code Playgroud)