协同过滤算法 - 集体智慧编程 - SegmentFault
协同过滤是利用集体智慧的一个典型方法。要理解什么是协同过滤 (Collaborative Filtering, 简称CF),首先想一个简单的问题,如果你现在想看个电影,但你不知道具体看哪部,你会怎么做?大部分的人会问问周围的朋友,看看最近有什么好看的电影推荐,而我们一般更倾向于从口味比较类似的朋友那里得到推荐。这就是协同过滤的核心思想。
协同过滤一般是在海量的用户中发掘出一小部分和你品位比较类似的,在协同过滤中,这些用户成为邻居,然后根据他们喜欢的其他东西组织成一个排序的目录推荐给你。
要实现协同过滤,需要以下几个步骤:
搜集偏好
寻找相近用户
推荐物品
搜集偏好
首先,我们要寻找一种表达不同人及其偏好的方法。这里我们用python的嵌套字典来实现。
在本章中所用的数据,是从国外的网站grouplens下载的u.data。该数据总共四列,共分为用户ID、电影ID、用户评分、时间。我们只需根据前三列,生成相应的用户偏好字典。
#生成用户偏好字典 def make_data(): result={} f = open('data/u.data', 'r') lines = f.readlines() for line in lines: #按行分割数据 (userId , itemId , score,time ) = line.strip().split("\t") #字典要提前定义 if not result.has_key( userId ): result[userId]={} #注意float,不然后续的运算存在类型问题 result[userId][itemId] = float(score) return result
另外如果想在字典中显示展现电影名,方便分析,也可以根据u.item中电影数据,预先生成电影的数据集。
#将id替换为电影名 构造数据集 def loadMovieLens(path='data'): # Get movie titles movies={} for line in open(path+'/u.item'): (id,title)=line.split('|')[0:2] movies[id]=title # Load data prefs={} for line in open(path+'/u.data'): (user,movieid,rating,ts)=line.split('\t') prefs.setdefault(user,{}) prefs[user][movies[movieid]]=float(rating) return prefs
根据上面两个函数中的一种,到此我们的用户数据集已经构造好了,由于数据量不是非常大,暂时放在内存中即可。
由于以上数据集比较抽象,不方便讲解,至此我们定义一个简单的数据集来讲解一些例子,一个简单的嵌套字典:
Read full article from 协同过滤算法 - 集体智慧编程 - SegmentFault
No comments:
Post a Comment