当前位置:   article > 正文

python实现协同过滤推荐算法完整代码示例_协同过滤算法python代码

协同过滤算法python代码

声明:本文为搬运,看不惯那些收费的,原文链接在文章尾部

这篇文章主要介绍了python实现协同过滤推荐算法完整代码示例,具有一定借鉴价值,需要的朋友可以参考下。

测试数据

MovieLens | GroupLens

协同过滤推荐算法主要分为:

1、基于用户。根据相邻用户,预测当前用户没有偏好的未涉及物品,计算得到一个排序的物品列表进行推荐

2、基于物品。如喜欢物品A的用户都喜欢物品C,那么可以知道物品A与物品C的相似度很高,而用户C喜欢物品A,那么可以推断出用户C也可能喜欢物品C。

不同的数据、不同的程序猿写出的协同过滤推荐算法不同,但其核心是一致的:

1、收集用户的偏好

1)不同行为分组

2)不同分组进行加权计算用户的总喜好

3)数据去噪和归一化

2、找到相似用户(基于用户)或者物品(基于物品)

3、计算相似度并进行排序。根据相似度为用户进行推荐

本次实例过程:

1、初始化数据

获取movies和ratings

转换成数据userDict表示某个用户的所有电影的评分集合,并对评分除以5进行归一化

转换成数据ItemUser表示某部电影参与评分的所有用户集合

2、计算所有用户与userId的相似度

找出所有观看电影与userId有交集的用户

对这些用户循环计算与userId的相似度

获取A用户与userId的并集。格式为:{'电影ID',[A用户的评分,userId的评分]},没有评分记为0

计算A用户与userId的余弦距离,越大越相似

3、根据相似度生成推荐电影列表

4、输出推荐列表和准确率

 

  1. #!/usr/bin/python3
  2. # -*- coding: utf-8 -*-
  3. from numpy import *
  4. import time
  5. from texttable import Texttable
  6. class CF:
  7. def __init__(self, movies, ratings, k=5, n=10):
  8. self.movies = movies
  9. self.ratings = ratings
  10. # 邻居个数
  11. self.k = k
  12. # 推荐个数
  13. self.n = n
  14. # 用户对电影的评分
  15. # 数据格式{'UserID:用户ID':[(MovieID:电影ID,Rating:用户对电影的评星)]}
  16. self.userDict = {}
  17. # 对某电影评分的用户
  18. # 数据格式:{'MovieID:电影ID',[UserID:用户ID]}
  19. # {'1',[1,2,3..],...}
  20. self.ItemUser = {}
  21. # 邻居的信息
  22. self.neighbors = []
  23. # 推荐列表
  24. self.recommandList = []
  25. self.cost = 0.0
  26. # 基于用户的推荐
  27. # 根据对电影的评分计算用户之间的相似度
  28. def recommendByUser(self, userId):
  29. self.formatRate()
  30. # 推荐个数 等于 本身评分电影个数,用户计算准确率
  31. self.n = len(self.userDict[userId])
  32. self.getNearestNeighbor(userId)
  33. self.getrecommandList(userId)
  34. self.getPrecision(userId)
  35. # 获取推荐列表
  36. def getrecommandList(self, userId):
  37. self.recommandList = []
  38. # 建立推荐字典
  39. recommandDict = {}
  40. for neighbor in self.neighbors:
  41. movies = self.userDict[neighbor[1]]
  42. for movie in movies:
  43. if(movie[0] in recommandDict):
  44. recommandDict[movie[0]] += neighbor[0]
  45. else:
  46. recommandDict[movie[0]] = neighbor[0]
  47. # 建立推荐列表
  48. for key in recommandDict:
  49. self.recommandList.append([recommandDict[key], key])
  50. self.recommandList.sort(reverse=True)
  51. self.recommandList = self.recommandList[:self.n]
  52. # 将ratings转换为userDict和ItemUser
  53. def formatRate(self):
  54. self.userDict = {}
  55. self.ItemUser = {}
  56. for i in self.ratings:
  57. # 评分最高为5 除以5 进行数据归一化
  58. temp = (i[1], float(i[2]) / 5)
  59. # 计算userDict {'1':[(1,5),(2,5)...],'2':[...]...}
  60. if(i[0] in self.userDict):
  61. self.userDict[i[0]].append(temp)
  62. else:
  63. self.userDict[i[0]] = [temp]
  64. # 计算ItemUser {'1',[1,2,3..],...}
  65. if(i[1] in self.ItemUser):
  66. self.ItemUser[i[1]].append(i[0])
  67. else:
  68. self.ItemUser[i[1]] = [i[0]]
  69. # 找到某用户的相邻用户
  70. def getNearestNeighbor(self, userId):
  71. neighbors = []
  72. self.neighbors = []
  73. # 获取userId评分的电影都有那些用户也评过分
  74. for i in self.userDict[userId]:
  75. for j in self.ItemUser[i[0]]:
  76. if(j != userId and j not in neighbors):
  77. neighbors.append(j)
  78. # 计算这些用户与userId的相似度并排序
  79. for i in neighbors:
  80. dist = self.getCost(userId, i)
  81. self.neighbors.append([dist, i])
  82. # 排序默认是升序,reverse=True表示降序
  83. self.neighbors.sort(reverse=True)
  84. self.neighbors = self.neighbors[:self.k]
  85. # 格式化userDict数据
  86. def formatuserDict(self, userId, l):
  87. user = {}
  88. for i in self.userDict[userId]:
  89. user[i[0]] = [i[1], 0]
  90. for j in self.userDict[l]:
  91. if(j[0] not in user):
  92. user[j[0]] = [0, j[1]]
  93. else:
  94. user[j[0]][1] = j[1]
  95. return user
  96. # 计算余弦距离
  97. def getCost(self, userId, l):
  98. # 获取用户userId和l评分电影的并集
  99. # {'电影ID':[userId的评分,l的评分]} 没有评分为0
  100. user = self.formatuserDict(userId, l)
  101. x = 0.0
  102. y = 0.0
  103. z = 0.0
  104. for k, v in user.items():
  105. x += float(v[0]) * float(v[0])
  106. y += float(v[1]) * float(v[1])
  107. z += float(v[0]) * float(v[1])
  108. if(z == 0.0):
  109. return 0
  110. return z / sqrt(x * y)
  111. # 推荐的准确率
  112. def getPrecision(self, userId):
  113. user = [i[0] for i in self.userDict[userId]]
  114. recommand = [i[1] for i in self.recommandList]
  115. count = 0.0
  116. if(len(user) >= len(recommand)):
  117. for i in recommand:
  118. if(i in user):
  119. count += 1.0
  120. self.cost = count / len(recommand)
  121. else:
  122. for i in user:
  123. if(i in recommand):
  124. count += 1.0
  125. self.cost = count / len(user)
  126. # 显示推荐列表
  127. def showTable(self):
  128. neighbors_id = [i[1] for i in self.neighbors]
  129. table = Texttable()
  130. table.set_deco(Texttable.HEADER)
  131. table.set_cols_dtype(["t", "t", "t", "t"])
  132. table.set_cols_align(["l", "l", "l", "l"])
  133. rows = []
  134. rows.append([u"movie ID", u"Name", u"release", u"from userID"])
  135. for item in self.recommandList:
  136. fromID = []
  137. for i in self.movies:
  138. if i[0] == item[1]:
  139. movie = i
  140. break
  141. for i in self.ItemUser[item[1]]:
  142. if i in neighbors_id:
  143. fromID.append(i)
  144. movie.append(fromID)
  145. rows.append(movie)
  146. table.add_rows(rows)
  147. print(table.draw())
  148. # 获取数据
  149. def readFile(filename):
  150. files = open(filename, "r", encoding="utf-8")
  151. # 如果读取不成功试一下
  152. # files = open(filename, "r", encoding="iso-8859-15")
  153. data = []
  154. for line in files.readlines():
  155. item = line.strip().split("::")
  156. data.append(item)
  157. return data
  158. # -------------------------开始-------------------------------
  159. start = time.clock()
  160. movies = readFile("/home/hadoop/Python/CF/movies.dat")
  161. ratings = readFile("/home/hadoop/Python/CF/ratings.dat")
  162. demo = CF(movies, ratings, k=20)
  163. demo.recommendByUser("100")
  164. print("推荐列表为:")
  165. demo.showTable()
  166. print("处理的数据为%d条" % (len(demo.ratings)))
  167. print("准确率: %.2f %%" % (demo.cost * 100))
  168. end = time.clock()
  169. print("耗费时间: %f s" % (end - start))

原文链接:https://www.jb51.net/article/130674.htm

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/198592
推荐阅读
相关标签
  

闽ICP备14008679号