协同过滤算法的实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档