不到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的绘图工具matplotlib使用实例
Jul 03 Python
Python读取文件内容的三种常用方式及效率比较
Oct 07 Python
python实现植物大战僵尸游戏实例代码
Jun 10 Python
python障碍式期权定价公式
Jul 19 Python
18个Python脚本可加速你的编码速度(提示和技巧)
Oct 17 Python
Ranorex通过Python将报告发送到邮箱的方法
Jan 12 Python
服务器端jupyter notebook映射到本地浏览器的操作
Apr 14 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
May 22 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
Jun 01 Python
Python基于mediainfo批量重命名图片文件
Dec 29 Python
Python数据可视化之用Matplotlib绘制常用图形
Jun 03 Python
python中opencv实现图片文本倾斜校正
Jun 11 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计算上一个月的今天
2013/05/23 PHP
destoon整合ucenter后注册页面不跳转的解决方法
2014/06/21 PHP
php实现的九九乘法口诀表简洁版
2014/07/28 PHP
Java中final关键字详解
2015/08/10 PHP
JScript的条件编译
2007/05/29 Javascript
多种方式实现JS调用后台方法进行数据交互
2013/08/20 Javascript
JS小功能(setInterval实现图片效果显示时间)实例代码
2013/11/28 Javascript
JavaScript中的闭包
2016/02/24 Javascript
JavaScript和jquery获取父级元素、子级元素、兄弟元素的方法
2016/06/05 Javascript
javascript中对象的定义、使用以及对象和原型链操作小结
2016/12/14 Javascript
React-Native之定时器Timer的实现代码
2017/10/04 Javascript
vue2中的keep-alive使用总结及注意事项
2017/12/21 Javascript
Node.js爬取豆瓣数据实例分析
2018/03/05 Javascript
js比较两个单独的数组或对象是否相等的实例代码
2019/04/28 Javascript
Vue 处理表单input单行文本框的实例代码
2019/05/09 Javascript
浅谈layui 数据表格前后台传值的问题
2019/09/12 Javascript
详解关于Vue单元测试的几个坑
2020/04/26 Javascript
[06:42]DOTA2每周TOP10 精彩击杀集锦vol.1
2014/06/25 DOTA
使用Python的Tornado框架实现一个一对一聊天的程序
2015/04/25 Python
Pycharm学习教程(1) 定制外观
2017/05/02 Python
python中import reload __import__的区别详解
2017/10/16 Python
pandas数据预处理之dataframe的groupby操作方法
2018/04/13 Python
python SQLAlchemy 中的Engine详解
2019/07/04 Python
pytorch中torch.max和Tensor.view函数用法详解
2020/01/03 Python
在django中form的label和verbose name的区别说明
2020/05/20 Python
快速一键生成Python爬虫请求头
2021/03/04 Python
俄罗斯隐形眼镜和眼镜在线商店:Cronos
2020/06/02 全球购物
拾金不昧表扬稿大全
2015/05/05 职场文书
2015年干部教育培训工作总结
2015/05/15 职场文书
家长反馈意见及建议
2015/06/03 职场文书
实施意见格式范本
2015/06/05 职场文书
pytorch 两个GPU同时训练的解决方案
2021/06/01 Python
python处理json数据文件
2022/04/11 Python
Python实现批量将文件复制到新的目录中再修改名称
2022/04/12 Python
openstack云计算keystone组件工作介绍
2022/04/20 Servers