集体智慧编程读书笔记(一)提供推荐

时间:2022-12-25 12:36:51


本书的第二章提供推荐主要涉及了三种情形的推荐:

1:推荐相似兴趣的人

2:推荐影片/书籍

3:匹配影片/书籍

 

算法的实现主要描述如下:

1:推荐相似兴趣的人

通过将人与人的某一兴趣(电影,书籍...)中的详细名目评分的相似度关系计算来实现人的推荐。主要的相似度计算方法有:

  • 欧几里得距离法:

通过用户对各项作品的评分,有n个评分,即为n维距离,根据距离的长短来确定相似度。

在二维和三维空间中的欧式距离的就是两点之间的距离,二维的公式是
d = sqrt((x1-x2)^+(y1-y2)^)
三维的公式是
d=sqrt(x1-x2)^+(y1-y2)^+z1-z2)^)
推广到n维空间,欧式距离的公式是
d=sqrt( ∑(xi1-xi2)^ ) 这里i=1,2..n
xi1表示第一个点的第i维坐标,xi2表示第二个点的第i维坐标

好处:简单,实现容易

弊端:当比较项目特别少时,偏差较大。当两个数组的项目个数差异巨大时,使用该种方法得到的相似度偏差较大。

  • 皮尔逊(pearson)相关度评价

与欧几里得不同的是,皮尔逊相关度评价着重于给出最佳拟合线。

皮尔逊相关度可以纠正由于项目相差大导致的偏差。

集体智慧编程读书笔记(一)提供推荐  集体智慧编程读书笔记(一)提供推荐集体智慧编程读书笔记(一)提供推荐

好处:反应相关度计算中最常用的算法,用于有精确数值存在时的相似度计算

弊端:公式较为复杂

  • Tanimoto系数/Jaccard系数

交集/并集:A∩B/(A+B-A∩B)

用途:主要用于无精确数值,只有存在或者不存在两种状态的情况下计算相似度

通过以上的相似度算法去匹配与自己同好的用户,并给出推荐。


2:推荐影片/书籍

在第一步中计算出的相似度会在此阶段中作为权值与各自推荐的分数相乘从而得出影片的加权平均分,最后排序给出推荐的物品列表。

 

3:匹配影片/书籍

通过将第一步的人与物品对调,可以得到一个关于物品的list,物品下面包含了很多人对它的评价,这些人还同时评价其他的物品,从而在对比物品的时候我们可以得到关于物品评分的两个向量(一一对应,对应着同一人对两个物品的不同评价)。

 

课后习题:

1:Tanimoto仅仅在状态为非有即无时。

def sim_Tanimoto(prefs,person1,person2):
# Get the list of shared_items
intersection=0
for item in prefs[person1]:
if item in prefs[person2]:
intersection+=1.0
si=intersection/(len(prefs[person1])+len(prefs[person2])-intersection) #si=(A∩B)/(A+B-A∩B)
return si


2:由于delicious API无法使用,只有用其他网站的API来实现,这里我使用的是FM.last API,这里直接通过对比两个标签下的热门歌曲交集来获取他们的相似度,所以用到了Tanimoto算法。

def tagList(tag=''):
albums_list={}
albums_list[tag]={}
tags=network.get_tag(tag)
for p1 in tags.get_top_albums():
p1=str(p1)
p1start=p1.index('Album')+8
p1end=p1.index(',')-1
p1=p1[p1start:p1end]
albums_list[tag][p1]=1.0
for item in tags.get_similar()[0:3]:
p1=str(item)
albums_list[p1]={}
items=network.get_tag(p1)
for p2 in items.get_top_albums():
p2=str(p2)
p2start=p2.index('Album')+8
p2end=p2.index(',')-1
p3=p2[p2start:p2end]
albums_list[p1][p3]=1.0
return albums_list

def recommondation(tag=''):
raw_list=tagList(tag)
print raw_list
recommond={}
coefficient=0
for item in raw_list:
if item != tag:
recommond[item]=0
coefficient=sim_Tanimoto(raw_list,tag,item)
recommond[item]=coefficient
recommond.sort()
recommond.reverse()
return recommond


def sim_Tanimoto(prefs,person1,person2):
# Get the list of shared_items
intersection=0
for item in prefs[person1]:
if item in prefs[person2]:
intersection+=1.0
print intersection
si=intersection/(len(prefs[person1])+len(prefs[person2])-intersection) #si=(A∩B)/(A+B-A∩B)
return si

print recommondation('rock')


5:已经在练习2中用到了这组API。