《集体智慧编程》中的这个 python 函数有什么问题?
这是有问题的函数。它计算 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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
看起来您可能意外地使用了整数除法。我进行了以下更改,您的函数返回了
1.0
:请参阅 PEP 238 了解有关 Python 中除法运算符的更多信息。修复上述代码的另一种方法是:
It looks like you may be unexpectedly using integer division. I made the following change and your function returned
1.0
:See PEP 238 for more information on the division operator in Python. An alternate way of fixing your above code is:
好吧,我花了一分钟时间阅读代码,但似乎如果您将输入数据更改为浮点数,它就会起作用
Well it took me a minute to read over the code but it seems if you change your input data to floats it will work
整数除法令人困惑。如果你将
n
设置为浮点数,它就会起作用:Integer division is confusing it. It works if you make
n
a float:好吧,我无法完全找到您的函数中的逻辑有什么问题,所以我只是使用皮尔逊系数的定义重新实现它:
请注意,在您的示例中,皮尔逊系数只是
1.0
因为向量 (-4/3, 2/3, 2/3) 和 (-2/3, 1/3, 1/3) 是平行的。Well, I wasn't exactly able to find what's wrong with the logic in your function, so I just reimplemented it using the definition of Pearson coefficient:
Note that in your example the Pearson coefficient is just
1.0
since vectors (-4/3, 2/3, 2/3) and (-2/3, 1/3, 1/3) are parallel.