侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   210

测试数据

http://grouplens.org/datasets/movielens/

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

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、输出推荐列表和准确率

#!/usr/bin/python3# -*- coding: utf-8 -*-from numpy import *import timefrom texttable import Texttableclass CF:  def __init__(self, movies, ratings, k=5, n=10):    self.movies = movies    self.ratings = ratings    # 邻居个数    self.k = k    # 推荐个数    self.n = n    # 用户对电影的评分    # 数据格式{'UserID:用户ID':[(MovieID:电影ID,Rating:用户对电影的评星)]}    self.userDict = {}    # 对某电影评分的用户    # 数据格式:{'MovieID:电影ID',[UserID:用户ID]}    # {'1',[1,2,3..],...}    self.ItemUser = {}    # 邻居的信息    self.neighbors = []    # 推荐列表    self.recommandList = []    self.cost = 0.0  # 基于用户的推荐  # 根据对电影的评分计算用户之间的相似度  def recommendByUser(self, userId):    self.formatRate()    # 推荐个数 等于 本身评分电影个数,用户计算准确率    self.n = len(self.userDict[userId])    self.getNearestNeighbor(userId)    self.getrecommandList(userId)    self.getPrecision(userId)  # 获取推荐列表  def getrecommandList(self, userId):    self.recommandList = []    # 建立推荐字典    recommandDict = {}    for neighbor in self.neighbors:      movies = self.userDict[neighbor[1]]      for movie in movies:        if(movie[0] in recommandDict):          recommandDict[movie[0]] += neighbor[0]        else:          recommandDict[movie[0]] = neighbor[0]    # 建立推荐列表    for key in recommandDict:      self.recommandList.append([recommandDict[key], key])    self.recommandList.sort(reverse=True)    self.recommandList = self.recommandList[:self.n]  # 将ratings转换为userDict和ItemUser  def formatRate(self):    self.userDict = {}    self.ItemUser = {}    for i in self.ratings:      # 评分最高为5 除以5 进行数据归一化      temp = (i[1], float(i[2]) / 5)      # 计算userDict {'1':[(1,5),(2,5)...],'2':[...]...}      if(i[0] in self.userDict):        self.userDict[i[0]].append(temp)      else:        self.userDict[i[0]] = [temp]      # 计算ItemUser {'1',[1,2,3..],...}      if(i[1] in self.ItemUser):        self.ItemUser[i[1]].append(i[0])      else:        self.ItemUser[i[1]] = [i[0]]  # 找到某用户的相邻用户  def getNearestNeighbor(self, userId):    neighbors = []    self.neighbors = []    # 获取userId评分的电影都有那些用户也评过分    for i in self.userDict[userId]:      for j in self.ItemUser[i[0]]:        if(j != userId and j not in neighbors):          neighbors.append(j)    # 计算这些用户与userId的相似度并排序    for i in neighbors:      dist = self.getCost(userId, i)      self.neighbors.append([dist, i])    # 排序默认是升序,reverse=True表示降序    self.neighbors.sort(reverse=True)    self.neighbors = self.neighbors[:self.k]  # 格式化userDict数据  def formatuserDict(self, userId, l):    user = {}    for i in self.userDict[userId]:      user[i[0]] = [i[1], 0]    for j in self.userDict[l]:      if(j[0] not in user):        user[j[0]] = [0, j[1]]      else:        user[j[0]][1] = j[1]    return user  # 计算余弦距离  def getCost(self, userId, l):    # 获取用户userId和l评分电影的并集    # {'电影ID':[userId的评分,l的评分]} 没有评分为0    user = self.formatuserDict(userId, l)    x = 0.0    y = 0.0    z = 0.0    for k, v in user.items():      x += float(v[0]) * float(v[0])      y += float(v[1]) * float(v[1])      z += float(v[0]) * float(v[1])    if(z == 0.0):      return 0    return z / sqrt(x * y)  # 推荐的准确率  def getPrecision(self, userId):    user = [i[0] for i in self.userDict[userId]]    recommand = [i[1] for i in self.recommandList]    count = 0.0    if(len(user) >= len(recommand)):      for i in recommand:        if(i in user):          count += 1.0      self.cost = count / len(recommand)    else:      for i in user:        if(i in recommand):          count += 1.0      self.cost = count / len(user)  # 显示推荐列表  def showTable(self):    neighbors_id = [i[1] for i in self.neighbors]    table = Texttable()    table.set_deco(Texttable.HEADER)    table.set_cols_dtype(["t", "t", "t", "t"])    table.set_cols_align(["l", "l", "l", "l"])    rows = []    rows.append([u"movie ID", u"Name", u"release", u"from userID"])    for item in self.recommandList:      fromID = []      for i in self.movies:        if i[0] == item[1]:          movie = i          break      for i in self.ItemUser[item[1]]:        if i in neighbors_id:          fromID.append(i)      movie.append(fromID)      rows.append(movie)    table.add_rows(rows)    print(table.draw())# 获取数据def readFile(filename):  files = open(filename, "r", encoding="utf-8")  # 如果读取不成功试一下  # files = open(filename, "r", encoding="iso-8859-15")  data = []  for line in files.readlines():    item = line.strip().split("::")    data.append(item)  return data# -------------------------开始-------------------------------start = time.clock()movies = readFile("/home/hadoop/Python/CF/movies.dat")ratings = readFile("/home/hadoop/Python/CF/ratings.dat")demo = CF(movies, ratings, k=20)demo.recommendByUser("100")print("推荐列表为:")demo.showTable()print("处理的数据为%d条" % (len(demo.ratings)))print("准确率: %.2f %%" % (demo.cost * 100))end = time.clock()print("耗费时间: %f s" % (end - start))

总结

以上就是本文关于python实现协同过滤推荐算法完整代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

python实现机械分词之逆向最大匹配算法代码示例

K-近邻算法的python实现代码分享

详解K-means算法在Python中的实现

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!


  • 上一条:
    神经网络理论基础及Python实现详解
    下一条:
    python3大文件解压和基本操作
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客