不到40行代码用Python实现一个简单的推荐系统


Posted in Python onMay 10, 2019

什么是推荐系统

维基百科这样解释道:推荐系统属于资讯过滤的一种应用。推荐系统能够将可能受喜好的资讯或实物(例如:电影、电视节目、音乐、书籍、新闻、图片、网页)推荐给使用者。

本质上是根据用户的一些行为数据有针对性的推荐用户更可能感兴趣的内容。比如在网易云音乐听歌,听得越多,它就会推荐越多符合你喜好的音乐。

推荐系统是如何工作的呢?有一种思路如下:

用户 A 听了 收藏了 a,b,c 三首歌。用户 B 收藏了 a, b 两首歌,这时候推荐系统就把 c 推荐给用户 B。因为算法判断用户 A,B 对音乐的品味有极大可能一致。

推荐算法分类

最常见的推荐算法分为基于内容推荐以及协同过滤。协同过滤又可以分为基于用户的协同过滤和基于物品的协同过滤
基于内容推荐是直接判断所推荐内容本身的相关性,比如文章推荐,算法判断某篇文章和用户历史阅读文章的相关性进行推荐。

基于用户的协同过滤就是文章开头举的例子。

基于物品的协同过滤:

假设用户 A,B,C 都收藏了音乐 a,b。然后用户 D 收藏了音乐 a,那么这时候就推荐音乐 b 给他。

动手打造自己的推荐系统

这一次我们要做的是一个简单的电影推荐,虽然离工业应用还差十万八千里,但是非常适合新手一窥推荐系统的内部原理。数据集包含两个文件:ratings.csv 和 movies.csv。

# 载入数据
import pandas as pd
import numpy as np
df = pd.read_csv('data/ratings.csv')
df.head()

ratings.csv 包含四个维度的数据:

  • userId:打分用户的 ID
  • movieId: 被打分电影的 ID
  • rating: 用户给电影的打分,处于[1,5]
  • timestamp: 电影被打分的时间

要推荐电影还需要有电影的名字,电影名字保存在 movies.csv 中:

movies = pd.read_csv('data/movies.csv')
movies.head()

将 ratings.csv 和 movies.csv 的数据根据 movieId 合并。

df = pd.merge(df, movie_title, on='movieId')
df.head()

我们这次要做的推荐系统的核心思路是:

  • 根据所有用户评分判断所有电影与用户 a 已观看的某部电影 A 的相似度
  • 给用户 a 推荐相似度高且评分高的电影

所以我们要先有所有用户对所有电影的评分的列联表:

movie_matrix = df.pivot_table(index = 'userId', columns = 'title' ,values = 'rating')
movie_matrix.head()

假设用户 A 观看的电影是 air_force_one (1997),则计算列联表中所有电影与 air_force_one (1997) 的相关性。

AFO_user_rating = movie_matrix['Air Force One (1997)']
simliar_to_air_force_one = movie_matrix.corrwith(AFO_user_rating)

这样我们就得到了所有电影与 air_force_one (1997)的相关性。

但是,直接对这个相关性进行排序并推荐最相关的电影有一个及其严重的问题:

ratings = pd.DataFrame(df.groupby('title')['rating'].mean())#计算电影平均得分
ratings['number_of_ratings'] = df.groupby('title')['rating'].count()
import matplotlib.pyplot as plt
%matplotlib inline
ratings['number_of_ratings'].hist(bins = 60);

不到40行代码用Python实现一个简单的推荐系统

上图是电影被评分次数的直方图,可以看到大量的电影评分次数不足10次。评分次数太少的电影很容易就被判断为高相关性。所以我们要将这部分的评分删掉。

corr_AFO = pd.DataFrame(similar_to_air_force_one, columns = ['Correlation'])
corr_AFO.dropna(inplace = True)
corr_contact = corr_contact.join(ratings['number_of_ratings'],how = 'left',lsuffix='_left', rsuffix='_right')
corr_AFO[corr_AFO['number_of_ratings']>100].sort_values(by = 'Correlation',ascending = False).head()

这样我们就得到了一个与 air_force_one (1997) 高相关的电影列表。但是高相关有可能评分低(概率低),再从列表里挑几部平均得分高的电影推荐就好了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
用Python程序抓取网页的HTML信息的一个小实例
May 02 Python
浅谈python对象数据的读写权限
Sep 12 Python
解决python3中解压zip文件是文件名乱码的问题
Mar 22 Python
python用plt画图时,cmp设置方法
Dec 13 Python
Django unittest 设置跳过某些case的方法
Dec 26 Python
Python装饰器限制函数运行时间超时则退出执行
Apr 09 Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
Jun 10 Python
python面向对象 反射原理解析
Aug 12 Python
关于Pytorch的MNIST数据集的预处理详解
Jan 10 Python
python,Java,JavaScript实现indexOf
Sep 09 Python
Python爬虫+Tkinter制作一个翻译软件的示例
Feb 20 Python
python3实现无权最短路径的方法
May 12 Python
Python和Java的语法对比分析语法简洁上python的确完美胜出
May 10 #Python
Python3列表内置方法大全及示例代码小结
May 10 #Python
详解python 爬取12306验证码
May 10 #Python
详解用python写一个抽奖程序
May 10 #Python
python实现小球弹跳效果
May 10 #Python
基于python实现百度翻译功能
May 09 #Python
python使用time、datetime返回工作日列表实例代码
May 09 #Python
You might like
用文本文件制作留言板提示(下)
2006/10/09 PHP
php利用递归实现删除文件目录的方法
2016/09/23 PHP
PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法
2017/09/13 PHP
php下的原生ajax请求用法实例分析
2020/02/28 PHP
发一个自己用JS写的实用看图工具实现代码
2008/07/26 Javascript
JavaScript获取多个数组的交集简单实例
2013/11/11 Javascript
使用js如何实现全选与全不选
2013/12/30 Javascript
JavaScript中输出标签的方法
2014/08/27 Javascript
node.js从数据库获取数据
2016/05/08 Javascript
判断是否存在子节点的实现代码
2016/05/18 Javascript
vue2 router 动态传参,多个参数的实例
2017/11/10 Javascript
js经验分享 JavaScript反调试技巧
2018/03/10 Javascript
详解angular2如何手动点击特定元素上的点击事件
2018/10/16 Javascript
微信小程序里引入SVG矢量图标的方法
2019/09/20 Javascript
Vue中this.$nextTick的作用及用法
2020/02/04 Javascript
Vue的双向数据绑定实现原理解析
2020/02/17 Javascript
[01:15:36]加油刀塔第二期网络版
2014/08/09 DOTA
梯度下降法介绍及利用Python实现的方法示例
2017/07/12 Python
详解Python发送email的三种方式
2018/10/18 Python
使用python批量化音乐文件格式转换的实例
2019/01/09 Python
浅谈Python编程中3个常用的数据结构和算法
2019/04/30 Python
用pycharm开发django项目示例代码
2019/06/13 Python
使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件及出现问题解决方法
2019/09/06 Python
Python如何实现小程序 无限求和平均
2020/02/18 Python
python 多线程死锁问题的解决方案
2020/08/25 Python
python爬取天气数据的实例详解
2020/11/20 Python
CSS3地图动态实例代码(圆圈向外扩散)
2018/06/15 HTML / CSS
html5利用canvas实现颜色容差抠图功能
2019/12/23 HTML / CSS
艺龙旅行网酒店预订:国内、港澳台酒店
2018/06/26 全球购物
缓解脚、腿和背部疼痛:Z-CoiL鞋
2019/03/12 全球购物
高三自我鉴定
2013/10/23 职场文书
马丁路德金演讲稿
2014/05/19 职场文书
学校运动会广播稿范文
2014/10/02 职场文书
校园广播稿100字
2014/10/06 职场文书
优秀教师单行材料
2014/12/16 职场文书
学会感恩主题班会
2015/08/12 职场文书