这个来自"编程集体智慧"的python函数出了什么问题?

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)

Gre*_*ill 8

看起来你可能会出乎意料地使用整数除法.我做了以下更改,并返回了您的函数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)