Python-基于物品的协同过滤算法(附两种算法的对比)
2017-09-10 19:32
441 查看
与上一篇UserCF数据来源一致。
先贴代码ItemCF:
UserCF和ItemCF的综合比较:
UserCF(适用新闻推荐等)
给用户推荐那些和他相同兴趣爱好的用户喜欢的物品,反映用户所在的小型兴趣群体中物品的热门程度。
ItemCF(适用图书、电商、电影网站等)
给用户推荐那些和他之前喜欢的物品类似的物品,更加个性化,反映了用户自己的兴趣传承。
先贴代码ItemCF:
#coding=utf-8 import math class ItemCF: def __init__(self,basefile,testfile): self.datafile = basefile self.testfile = testfile self.readData() self.readTestData() def readData(self): self.traindata = {} for line in open(self.datafile): userid,itemid,record,_ = line.split() self.traindata.setdefault(userid,{}) self.traindata[userid][itemid] = int(record) def readTestData(self): self.testdata = {} for line in open(self.testfile): userid,itemid,record,_ = line.split() self.testdata.setdefault(userid,{}) self.testdata[userid][itemid] = int(record) def ItemSimilarity(self): train = self.traindata C = dict() N = dict() for u, items in train.items(): for i in items.keys(): N.setdefault(i,0) N[i] += 1 for j in items.keys(): if i == j: continue C.setdefault(i,{}) C[i].setdefault(j,0) C[i][j] += 1 self.itermSimBest = dict()#物品与物品之间的相似度 for i,related_items in C.items(): self.itermSimBest.setdefault(i,{}) for j, cij in related_items.items(): self.itermSimBest[i].setdefault(j,0); self.itermSimBest[i][j] = cij / math.sqrt(N[i] * N[j]) def Recommendation(self,user_id,K = 8,nitem = 40): train = self.traindata rank = dict() ru = train.get(user_id)#用户历史记录 for i,pi in ru.items(): for j, wj in sorted(self.itermSimBest[i].items(),key=lambda x : x[1],reverse=True)[0:K]: if j in ru: continue rank.setdefault(j,0) rank[j] += pi * wj return dict(sorted(rank.items(),key = lambda x :x[1],reverse = True)[0:nitem]) def recallAndPrecision(self,test = None,k = 8,nitem = 10): train = self.traindata test = self.testdata hit = 0 recall = 0 precision = 0 for user in train.keys(): tu = test.get(user,{}) rank = self.Recommendation(user,k,nitem) for item,_ in rank.items(): if item in tu: hit += 1 recall += len(tu) precision += nitem return (hit / (recall * 1.0),hit / (precision * 1.0)) def testUserCF(): cf = ItemCF("train.txt","test.txt") cf.ItemSimilarity() print("%5s%5s%20s%20s" % ('K','N',"recall",'precision')) for k in [5,10,20,40,80,160]: for nitem in [5,10,15,20]: recall,precision = cf.recallAndPrecision( k=k,nitem=nitem ) print("%5d%5d%19.3f%%%19.3f%%" % (k,nitem,recall * 100,precision * 100)) if __name__=='__main__': testUserCF()
UserCF和ItemCF的综合比较:
UserCF(适用新闻推荐等)
给用户推荐那些和他相同兴趣爱好的用户喜欢的物品,反映用户所在的小型兴趣群体中物品的热门程度。
ItemCF(适用图书、电商、电影网站等)
给用户推荐那些和他之前喜欢的物品类似的物品,更加个性化,反映了用户自己的兴趣传承。
相关文章推荐
- 推荐算法--基于物品的协同过滤算法
- 推荐算法--基于物品协同过滤算法实现(python: Item-CF)
- 基于物品的协同过滤算法---《推荐系统实践》---Python源码(10)
- 推荐算法之基于物品的协同过滤算法
- 推荐算法——基于物品的协同过滤算法
- 基于物品的协同过滤算法和SlopeOne的python实现
- Python读取PostgreSQL数据并使用基于物品的协同过滤算法计算推荐结果
- 基于物品的协同过滤算法itemCF原理及python代码实现
- 基于物品的协同过滤算法和SlopeOne的python实现
- 推荐算法之基于物品的协同过滤算法
- python基于物品协同过滤算法实现代码
- GC算法精解(复制算法与标记/整理算法) 目前的两种主流算法,基于标记清除算法而来
- 无需复杂深度学习算法,基于计算机视觉使用Python和OpenCV计算道路交通
- 求a的n次方的两种算法对比
- python程序-->字典物品统计算法
- 基于python的分词算法的实现(2) - 字典的选择
- 基于sparkMLlib的机器学习_[2]_基本算法[1]协同过滤算法
- 实战智能推荐系统(8)-- 基于物品的协同过滤算法
- Spark资源调度机制源码分析--基于spreadOutApps及非spreadOutApps两种资源调度算法
- 基于用户的协同过滤算法和基于物品的协同过滤算法之java实现