gpt4 book ai didi

python - 来自 "Programming Collective Intelligence"的这个 python 函数有什么问题?

转载 作者:太空狗 更新时间:2023-10-30 01:49:48 27 4
gpt4 key购买 nike

这是有问题的功能。它计算 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

最佳答案

看起来您可能意外地使用了整数除法。我进行了以下更改,您的函数返回了 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))

参见 PEP 238有关 Python 中除法运算符的更多信息。修复上述代码的另一种方法是:

from __future__ import division

关于python - 来自 "Programming Collective Intelligence"的这个 python 函数有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1423525/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com