皮尔逊相关度,其实就是我们数学里面说的相关系数。为什么我们这里又要用这个皮尔逊相关度来衡量用户之间的相近程度呢?那是因为可能存在这样的情况,某人和我的爱好都是一样的,但是他在打分的时候总是相对于我偏高或者是偏低,如果按照先前的欧几里德来评价,或许给出的结论是他与我的爱好并不相同,所以又提出了一种皮尔逊相关度评价标准,可以在这种情况下给出比较好的结论。相关系数大家应该比较了解,代码如下:
from math import sqrt
def sim_person(prefs,p1,p2):
si={}
for item in prefs[p1]:
if item in prefs[p2]:
si[item]=1
n=len(si)
if n==0:
return 0
#
sum1=sum([prefs[p1][item] for item in si])
sum2=sum([prefs[p2][item] for item in si])
sum1Sq=sum([pow(prefs[p1][item],2) for item in si])
sum2Sq=sum([pow(prefs[p2][item],2) for item in si])
pSum=sum([prefs[p1][item]*prefs[p2][item] for item in si])
num=n*pSum-sum1*sum2
den=sqrt(n*sum1Sq-pow(sum1,2))*sqrt(n*sum2Sq-pow(sum2,2))
if den==0:
return 0
r=num/den
#print r
return r