不到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使用Tkinter显示网络图片的方法
Apr 24 Python
在Python中使用__slots__方法的详细教程
Apr 28 Python
Python中的ctime()方法使用教程
May 22 Python
Windows环境下python环境安装使用图文教程
Mar 13 Python
python学习入门细节知识点
Mar 29 Python
python实现读Excel写入.txt的方法
Apr 29 Python
Python中的heapq模块源码详析
Jan 08 Python
python实现趣味图片字符化
Apr 30 Python
Django使用模板后无法找到静态资源文件问题解决
Jul 19 Python
基于Python解密仿射密码
Oct 21 Python
Python实现多线程下载脚本的示例代码
Apr 03 Python
python 牛顿法实现逻辑回归(Logistic Regression)
Oct 15 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
php foreach 参数强制类型转换的问题
2010/12/10 PHP
彻底搞懂PHP 变量结构体
2017/10/11 PHP
Laravel 读取 config 下的数据方法
2019/10/13 PHP
js获取location.href的参数实例代码
2013/08/02 Javascript
JavaScript限定复选框的选择个数示例代码
2013/08/25 Javascript
js/jquery判断浏览器的方法小结
2014/09/02 Javascript
深入了解Node.js中的一些特性
2014/09/25 Javascript
TinyMCE提交AjaxForm获取不到数据的解决方法
2015/03/05 Javascript
JavaScript基础语法之js表达式
2016/06/07 Javascript
全面解析Bootstrap中Carousel轮播的使用方法
2016/06/13 Javascript
JavaScript仿微信(电话)联系人列表滑动字母索引实例讲解(推荐)
2017/08/16 Javascript
jQuery实现的form转json经典示例
2017/10/10 jQuery
layui.js实现的表单验证功能示例
2017/11/15 Javascript
原生JS实现贪吃蛇小游戏
2020/03/09 Javascript
Vue多选列表组件深入详解
2021/03/02 Vue.js
python入门基础之用户输入与模块初认识
2016/11/14 Python
Python获取当前页面内所有链接的四种方法对比分析
2017/08/19 Python
python中类的属性和方法介绍
2018/11/27 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
2019/03/27 Python
python实现键盘输入的实操方法
2019/07/16 Python
django最快程序开发流程详解
2019/07/19 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
2020/03/06 Python
美国隐形眼镜零售商:LensPure
2019/03/10 全球购物
英国第一的市场和亚马逊替代品:OnBuy
2019/03/16 全球购物
Java平台和其他软件平台有什么不同
2015/06/05 面试题
营销与策划个人求职信
2013/09/22 职场文书
小学新教师培训方案
2014/02/03 职场文书
2014年党员公开承诺践诺书
2014/03/25 职场文书
运动会加油口号
2014/06/07 职场文书
交通事故代理词范文
2015/05/23 职场文书
中学后勤工作总结2015
2015/07/22 职场文书
2016年企业安全生产月活动总结
2016/04/06 职场文书
教你如何用python开发一款数字推盘小游戏
2021/04/14 Python
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
2021/07/01 MySQL
Nginx 路由转发和反向代理location配置实现
2021/11/11 Servers
详解OpenCV曝光融合
2022/04/29 Python