协同过滤算法的实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
协同过滤推荐方法的实现
一、基于用户的推荐系统实现
1、共同爱好-----英雄所爱略同
对一大群人进行搜索,并从中找出与我们品味相近的一小群人。算法会对这些人所偏爱的其他内容进行考察,并将他们组合起来构造出一个经过排名的推荐列表。比如:我们在当当网中输入“集体智慧编程”,点击此书链接后在页面下方会出现相关推荐列表,如图1所示:
图1:当当网对“集体智慧编程”相关的推荐结果
用户对电影评分数据二维表
用Python对上述数据的字典描述:
critics={'Lisa Rose':{'Lady in the Water':2.5,'Snakes on a Plane':3.5,'Just My
Luck':3.0,'Superman Returns':3.5,'You me and Dupree':2.5,'The Night Listener':3.0}, 'Gene Seymour':{'Lady in the Water':3.0,'Snakes on a Plane':3.5,'Just My Luck':1.5,'Superman Returns':5.0,'You me and Dupree':3.5,'The Night Listener':3.0}, 'Michael Phillips':{'Lady in the Water':2.5,'Snakes on a Plane':3.0,'Superman Returns':3.5,'The Night Listener':3.0},
'Claudia Puig':{'Sankes on a Plane':3.5,'Just My Luck':3.0,'The Night Listener':4.5,'Superman Returns':4.0},
'Mick LaSalle':{'Lady in the Water':3.0,'Snakes on a Plane':4.0,'Just My
Luck':2.0,'Superman Returns':3.0,'The Night Listener':3.0,'You,Me and Dupree':2.0},
'Jack Matthews':{'Lady in the Water':3.0,'Snakes on a Plane':4.0,'The Night Listener':3.0,'Superman Returns':5.0,'You,Me and Dupree':3.5},
'Toby':{'Snakes on a Plane':4.5,'You,Me and Dupree':1.0,'Superman
Returns':4.0}}
3、两人相似性如何评价?
常用的评价体系有:
(1)、Manhattan Distance——曼哈顿距离
a) 概念:最简单的距离计算方法就是曼哈顿距离,在二维图上,点A的坐标是(x1,y1),B的坐标是(x2,y2),那么A和B之间的曼哈顿距
离就是:r =|x1-x2| + |y1-y2|。
b) Python实现代码:
#曼哈顿距离评价
def sim_manhattan(prefs,person1,person2):
si={}
for item in prefs[person1]:
if item in prefs[person2]:
si[item]=1
if len(si)==0:return 0
sum_of_abs=sum([abs(prefs[person1][item]-prefs[person2][item]) for
item in si])
#此处做个技术处理,让相似度越高的值越大,同时防止分母为0
的情况出现,函数结果在:0~1之间。
return 1/(1+sum_of_abs)
c) 运行结果:
>>>sim_Manhattan(critics,'Toby','Gene Seymour')
结果为:0.18181818181818182
(2)、 Euclidean Distance——欧几里得距离
a) 概念:若n维向量A(x1,x2,…,x n)与B(y1,y2,…,y n),则A与
B之间的欧几里得距离为:
b) Python实现代码:
#欧基里德距离评价
def sim_ Euclidean(prefs,person1,person2):
#si存储共同评价过的电影名称
si={}
for item in prefs[person1]:
if item in prefs[person2]:
si[item]=1
if len(si)==0:return0
sum_of_squares=sum([pow(prefs[person1][item]-
prefs[person2][item],2) for item in si])
#偏好越相近的人距离越短,所以此处也做同样处理,取倒数,为避
免分母为零,可以将分母加1,函数结果在:0~1之间,1表示两人具
有一样的偏好。
return 1/(1+sqrt(sum_of_squares))
c) 运行结果:
>>> sim_Euclidean(critics,'Toby','Gene Seymour')
结果为:0.25824569976124334
(3)、Pearson——培生相关度评价
a) 概念:相对上两种评体系,Pearson相关系统要复杂得多,它是判断两组数据与某一直线拟合程序的一种度量。这条直接绘制的原则是尽可能地靠近两组数据的所有点。它能对不规范的数据起到一定的修正,降低不规范数据对结果的影响。比如:有的影评人因抵制杜文泽而只给电影《澳门风云》1分的差评;有的评论者可能是甄子丹的铁杆粉丝而却给电影《西游记大闹天宫》10分的好评。而前者在360影视网的得分为6.2分,后者仅为4.7分。
Pearson计算公式为:
上式难求,常常用近似公式代替:
b) Python实现代码:
#Pearson相关度评价
def sim_pearson(prefs,p1,p2):
si={}
for item in prefs[p1]:
if item in prefs[p2]:si[item]=1