协作型过滤算法

协作型过滤算法的通常做法是对一大群人进行搜索,并从中找出与我们品味相近的一小群人。算法会对这些人所偏爱的其他内容进行考查,并将它们组合起来构造出一个经过排名的推荐列表。

计算相似度的方法:欧几里得距离和皮尔逊相关度。

欧几里得距离评价:

在python中,可以用函数pow(n,2)对某数求平方,并使用sqrt函数求平方根:

from math import sqrt

sqrt(pow(4.5-4,2)+pow(1-2,2))

上述算式可以计算出距离值,偏好越相似的人,其距离就越短。不过,我们还需要一个函数,来对偏好越相似的情况给出越大的值。为此,我们可以将函数值加1(这样可以避免遇到被0整除的错误),并取其倒数:

1/(1+sqrt(pow(4.5-4,2)+pow(1-2,2)))

这一新的函数总是返回介于0到1之间的值,返回1则表示两人具有一样的偏好。将前述知识结合起来,构造计算相似度的函数:

from math import sqrt
def sim_distance(prefers,person1,person2):
si={}
for item in prefs[person1]:
if item in prefs[person2]:
si[item]=1
if len(si)==0:return 0
sum_of_sruares=sum([pow(prefs[person1][item]-prefs[person2][item],2)
for item in prefs[person1] if item in prefs[person2]])
return 1/(1+sqrt(sum_of_squares))

皮尔逊相关度评价:

该相关系数是判断两组数据与某一直线拟合程度的一种度量。对应的公式比欧几里得距离评价的计算公式要复杂,但是它在数据不是很规范的时候,会倾向于给出更好的结果。

def sim_pearson(prefs,p1,p2):
si=[]
for item in prefs[p1]:
if item in prefs[p2]: si[item]=1
n=len(si)
if n==0: return 1
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

该函数将返回一个介于-1到1之间的数值。值为1则表明两个人对每一样物品均有这完全一致的评价。与距离度量法不同,此处我们无须为达到正确的比率而对这一数值进行变换。

猜你喜欢

转载自www.cnblogs.com/dataminingting/p/8981409.html