不到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通过exifread模块获得图片exif信息的方法
Mar 16 Python
Python多线程编程(八):使用Event实现线程间通信
Apr 05 Python
Python捕捉和模拟鼠标事件的方法
Jun 03 Python
Python实现快速排序算法及去重的快速排序的简单示例
Jun 26 Python
详谈Python基础之内置函数和递归
Jun 21 Python
Python求出0~100以内的所有素数
Jan 23 Python
简单谈谈python基本数据类型
Sep 26 Python
在pycharm中为项目导入anacodna环境的操作方法
Feb 12 Python
Python库skimage绘制二值图像代码实例
Apr 10 Python
在Python中字典按值排序的实现方法
Nov 12 Python
python中使用.py配置文件的方法详解
Nov 23 Python
关于python中模块和重载的问题
Nov 02 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
咖啡磨器 如何选购一台适合家用的意式磨豆机
2021/03/05 新手入门
php抽奖小程序的实现代码
2013/06/18 PHP
destoon调用discuz论坛中带图片帖子的实现方法
2014/08/21 PHP
php提交表单发送邮件的方法
2015/03/20 PHP
phpcms配置列表页以及获得文章发布时间
2017/07/04 PHP
用方法封装javascript的new操作符(一)
2010/12/25 Javascript
javascript跨浏览器的属性判断方法
2014/03/16 Javascript
jQuery中的pushStack实现原理和应用实例
2015/02/03 Javascript
js实现checkbox全选、不选与反选的方法
2015/02/09 Javascript
ztree获取当前选中节点子节点id集合的方法
2015/02/12 Javascript
javascript中关于&& 和 || 表达式的小技巧分享
2015/04/10 Javascript
JavaScript中的this关键字使用详解
2015/08/14 Javascript
jQuery选择器基础入门教程
2016/05/10 Javascript
省市联动效果的简单实现代码(推荐)
2016/06/06 Javascript
jQuery筛选数组之grep、each、inArray、map的用法及遍历json对象
2016/06/20 Javascript
js 监控iframe URL的变化实例代码
2017/07/12 Javascript
vue-cli配置flexible过程详解
2019/07/04 Javascript
使用VUE实现在table中文字信息超过5个隐藏鼠标移到时弹窗显示全部
2019/09/16 Javascript
JavaScript 实现同时选取多个时间段的方法
2019/10/17 Javascript
JS数组降维的实现Array.prototype.concat.apply([], arr)
2020/04/28 Javascript
vue配置多代理服务接口地址操作
2020/09/08 Javascript
python中mechanize库的简单使用示例
2014/01/10 Python
Python字符串内置函数功能与用法总结
2019/04/16 Python
django搭建项目配置环境和创建表过程详解
2019/07/22 Python
opencv 图像礼帽和图像黑帽的实现
2020/07/07 Python
无惧面试,带你搞懂python 装饰器
2020/08/17 Python
Django CBV模型源码运行流程详解
2020/08/17 Python
python 爬取英雄联盟皮肤并下载的示例
2020/12/04 Python
美国班级戒指、帽子和礼服、毕业产品、年鉴:Balfour
2018/11/01 全球购物
《月球之谜》教学反思
2014/04/10 职场文书
期末学生评语大全
2014/04/24 职场文书
公司的门卫岗位职责
2014/09/09 职场文书
群众路线个人剖析材料及整改措施
2014/11/04 职场文书
2015年平安创建工作总结
2015/04/29 职场文书
化工厂员工工作总结
2015/10/15 职场文书
pt-archiver 主键自增
2022/04/26 MySQL