基于用户的协同过滤算法

基于用户的协同过滤算法-参考《推荐系统实践》一书,作者:项亮

  1 import random
  2 import math
  3 class UserBasedCF:
  4     def __init__(self,datafile = None):
  5         self.datafile = datafile
  6         self.readData()
  7         self.splitData(3,47)
  8     def readData(self,datafile = None):
  9         """
 10         read the data from the data file which is a data set
 11         """
 12         self.datafile = datafile or self.datafile
 13         self.data = []
 14         for line in open(self.datafile):
 15             userid,itemid,record,_ = line.split()
 16             self.data.append((userid,itemid,int(record)))
 17     def splitData(self,k,seed,data=None,M = 8):
 18         """
 19         split the data set
 20         testdata is a test data set
 21         traindata is a train set
 22         test data set / train data set is 1:M-1
 23         """
 24         self.testdata = {}
 25         self.traindata = {}
 26         data = data or self.data
 27         random.seed(seed)
 28         for user,item, record in self.data:
 29             if random.randint(0,M) == k:
 30                 self.testdata.setdefault(user,{})
 31                 self.testdata[user][item] = record
 32             else:
 33                 self.traindata.setdefault(user,{})
 34                 self.traindata[user][item] = record
 35     def userSimilarity(self,train = None):
 36         """
 37         One method of getting user similarity matrix
 38         """
 39         train = train or self.traindata
 40         self.userSim = dict()
 41         for u in train.keys():
 42             for v in train.keys():
 43                 if u == v:
 44                     continue
 45                 self.userSim.setdefault(u,{})
 46                 self.userSim[u][v] = len(set(train[u].keys()) & set(train[v].keys()))
 47                 self.userSim[u][v] /=math.sqrt(len(train[u]) * len(train[v]) *1.0)
 48     def userSimilarityBest(self,train = None):
 49         """
 50         the other method of getting user similarity which is better than above
 51         you can get the method on page 46
 52         In this experiment,we use this method
 53         """
 54         train = train or self.traindata
 55         self.userSimBest = dict()
 56         item_users = dict()
 57         for u,item in train.items():
 58             for i in item.keys():
 59                 item_users.setdefault(i,set())
 60                 item_users[i].add(u)
 61         user_item_count = dict()
 62         count = dict()
 63         for item,users in item_users.items():
 64             for u in users:
 65                 user_item_count.setdefault(u,0)
 66                 user_item_count[u] += 1
 67                 for v in users:
 68                     if u == v:continue
 69                     count.setdefault(u,{})
 70                     count[u].setdefault(v,0)
 71                     count[u][v] += 1
 72         for u ,related_users in count.items():
 73             self.userSimBest.setdefault(u,dict())
 74             for v, cuv in related_users.items():
 75                 self.userSimBest[u][v] = cuv / math.sqrt(user_item_count[u] * user_item_count[v] * 1.0)
 76
 77     def recommend(self,user,train = None,k = 8,nitem = 40):
 78         train = train or self.traindata
 79         rank = dict()
 80         interacted_items = train.get(user,{})
 81         for v ,wuv in sorted(self.userSimBest[user].items(),key = lambda x : x[1],reverse = True)[0:k]:
 82             for i , rvi in train[v].items():
 83                 if i in interacted_items:
 84                     continue
 85                 rank.setdefault(i,0)
 86                 rank[i] += wuv
 87         return dict(sorted(rank.items(),key = lambda x :x[1],reverse = True)[0:nitem])
 88     def recallAndPrecision(self,train = None,test = None,k = 8,nitem = 10):
 89         """
 90         Get the recall and precision, the method you want to know is listed
 91         in the page 43
 92         """
 93         train  = train or self.traindata
 94         test = test or self.testdata
 95         hit = 0
 96         recall = 0
 97         precision = 0
 98         for user in train.keys():
 99             tu = test.get(user,{})
100             rank = self.recommend(user, train = train,k = k,nitem = nitem)
101             for item,_ in rank.items():
102                 if item in tu:
103                     hit += 1
104             recall += len(tu)
105             precision += nitem
106         return (hit / (recall * 1.0),hit / (precision * 1.0))
107     def coverage(self,train = None,test = None,k = 8,nitem = 10):
108         train = train or self.traindata
109         test = test or self.testdata
110         recommend_items = set()
111         all_items  = set()
112         for user in train.keys():
113             for item in train[user].keys():
114                 all_items.add(item)
115             rank = self.recommend(user, train, k = k, nitem = nitem)
116             for item,_ in rank.items():
117                 recommend_items.add(item)
118         return len(recommend_items) / (len(all_items) * 1.0)
119     def popularity(self,train = None,test = None,k = 8,nitem = 10):
120         """
121         Get the popularity
122         the algorithm on page 44
123         """
124         train = train or self.traindata
125         test = test or self.testdata
126         item_popularity = dict()
127         for user ,items in train.items():
128             for item in items.keys():
129                 item_popularity.setdefault(item,0)
130                 item_popularity[item] += 1
131         ret = 0
132         n = 0
133         for user in train.keys():
134             rank = self.recommend(user, train, k = k, nitem = nitem)
135             for item ,_ in rank.items():
136                 ret += math.log(1+item_popularity[item])
137                 n += 1
138         return ret / (n * 1.0)
139
140 def testRecommend():
141     ubcf = UserBasedCF(‘u.data‘)
142     ubcf.readData()
143     ubcf.splitData(4,100)
144     ubcf.userSimilarity()
145     user = "345"
146     rank = ubcf.recommend(user,k = 3)
147     for i,rvi in rank.items():
148
149         items = ubcf.testdata.get(user,{})
150         record = items.get(i,0)
151         print "%5s: %.4f--%.4f" %(i,rvi,record)
152 def testUserBasedCF():
153     cf  =  UserBasedCF(‘u.data‘)
154     cf.userSimilarityBest()
155     print "%3s%20s%20s%20s%20s" % (‘K‘,"recall",‘precision‘,‘coverage‘,‘popularity‘)
156     for k in [5,10,20,40,80,160]:
157         recall,precision = cf.recallAndPrecision( k = k)
158         coverage = cf.coverage(k = k)
159         popularity = cf.popularity(k = k)
160         print "%3d%19.3f%%%19.3f%%%19.3f%%%20.3f" % (k,recall * 100,precision * 100,coverage * 100,popularity)
161
162 if __name__ == "__main__":
163     testUserBasedCF()

时间: 2024-10-11 07:25:27

基于用户的协同过滤算法的相关文章

Mahout实现基于用户的协同过滤算法

Mahout中对协同过滤算法进行了封装,看一个简单的基于用户的协同过滤算法. 基于用户:通过用户对物品的偏好程度来计算出用户的在喜好上的近邻,从而根据近邻的喜好推测出用户的喜好并推荐. 图片来源 程序中用到的数据都存在MySQL数据库中,计算结果也存在MySQL中的对应用户表中. package com.mahout.helloworlddemo; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.

基于用户的协同过滤算法(UserCF)

基于用户的协同过滤算法: 找到和目标用户相似的用户集合 找到这个集合中用户喜欢的但目标用户没有听过的物品 #encoding: utf-8 from Similarity import Person from Sort import select_sort file=open('user_bookmark','r') filew=open('user_bookRecommend','w') #加载训练集 trainSet={} while True: line=file.readline().s

推荐算法之基于用户的协同过滤算法

协同过滤是推荐算法中最基本的算法,主要分为基于用户的协同过滤算法和基于物品的协同过滤算法. 这篇文章主要介绍基于用户的协同过滤算法,简单来说,要给用户u作推荐,那么只要找出那些和u之前的行为类似的用户,即和u比较像的用户,把他们的行为推荐给用户u即可.所以基于用户的系统过滤算法包括两个步骤:1)找到和目标用户兴趣相似的用户集合  2)找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户. 第一步的关键点在于计算用户之间的相似度,相似度一般通过Jaccard公式或者余弦相似度即可求

spark基于用户的协同过滤算法与坑点,提交job

承接上文: http://blog.csdn.net/wangqi880/article/details/52875524 对了,每台机子的防火墙要关闭哈,不然spark集群启动不起来 前一次,已经把spark的分布式集群布置好了,今天写一个简单的案例来运行.会写一些关于spark的推荐的东西,这里主要有4点,1基于用户协同过滤,2基于物品协同过滤,3基于模型的协同过滤,4基于关联规则的推荐(fp_growth),只写核心代码啊. 基于spark用户协同过滤算法的实现 1用户协同过滤算法 1.1

基于用户的协同过滤推荐算法原理和实现

在推荐系统众多方法中,基于用户的协同过滤推荐算法是最早诞生的,原理也较为简单.该算法1992年提出并用于邮件过滤系统,两年后1994年被 GroupLens 用于新闻过滤.一直到2000年,该算法都是推荐系统领域最著名的算法. 本文简单介绍基于用户的协同过滤算法思想以及原理,最后基于该算法实现园友的推荐,即根据你关注的人,为你推荐博客园中其他你有可能感兴趣的人. 基本思想 俗话说"物以类聚.人以群分",拿看电影这个例子来说,如果你喜欢<蝙蝠侠>.<碟中谍>.&l

基于用户的协同过滤推荐算法

什么是推荐算法 推荐算法最早在1992年就提出来了,但是火起来实际上是最近这些年的事情,因为互联网的爆发,有了更大的数据量可以供我们使用,推荐算法才有了很大的用武之地. 最开始,所以我们在网上找资料,都是进yahoo,然后分门别类的点进去,找到你想要的东西,这是一个人工过程,到后来,我们用google,直接搜索自 己需要的内容,这些都可以比较精准的找到你想要的东西,但是,如果我自己都不知道自己要找什么肿么办?最典型的例子就是,如果我打开豆瓣找电影,或者我去 买说,我实际上不知道我想要买什么或者看

基于用户和基于物品的协同过滤算法的比较

首先回顾一下,协同过滤算法主要有两种,一种是基于用户的协同过滤算法(UserCF),另一种是基于物品的协同过滤算法(ItemCF). 基于用户的协同过滤算法主要有两步: 1)找到和目标用户兴趣相似的用户集合 2)找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户. 基于物品的协同过滤算法主要有两步: 1)计算物品之间的相似度. 2)根据物品的相似度和用户的历史行为给用户生成推荐列表. 由此可以看出UserCF是推荐用户所在兴趣小组中的热点,更注重社会化,而ItemCF则是根据用

推荐算法之基于用户的协同过滤

基于用户的的协同过滤算法是推荐统统最古老的算法,简称UserCF.该算法的诞生一定程度上标志着推荐系统的诞生.本文将对UserCF算法原理进行讲解,并且基于Movielens数据集给出实现代码供大家交流学习. 基本原理 在一个在线个性化推荐系统中,当一个用户A需要个性化推荐时,先找到和他相似兴趣的其他用户,然后把那些用户喜欢的而用户A没有听说过的物品推荐给用户A.这种方法就称为基于用户的协同过滤算法.该算法主要包括两个步骤: 找到和目标用户兴趣相似的用户集合 找到这个集合中用户喜欢的且目标用户没

【推荐系统实战】:C++实现基于用户的协同过滤(UserCollaborativeFilter)

好早的时候就打算写这篇文章,但是还是参加阿里大数据竞赛的第一季三月份的时候实验就完成了,硬生生是拖到了十一假期,自己也是醉了...找工作不是很顺利,希望写点东西回顾一下知识,然后再攒点人品吧,只能如此了. 一.问题背景 二.基于用户的协同过滤算法介绍 三.数据结构和实验过程设计 四.代码 一.问题背景 首先介绍一下问题的背景,现在我有四个月的用户.品牌数据<user,brand>,即用户在这四个月中的某一天购买了某个品牌(当然为了简化算法模型,将购买时间省去,后面再说).即现在有这四个月的数据