这是有问题的功能。它计算p1和p2的皮尔逊相关系数,假定该系数为-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
看来您可能意外地使用了整数除法。我进行了以下更改,您的函数返回了1.0:
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))
有关Python中除法运算符的更多信息,请参见PEP 238。解决上述代码的另一种方法是:
from __future__ import division