不到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中Django框架利用url来控制登录的方法
Jul 25 Python
Python基于辗转相除法求解最大公约数的方法示例
Apr 04 Python
Python实现的特征提取操作示例
Dec 03 Python
详解Python 解压缩文件
Apr 09 Python
Python QQBot库的QQ聊天机器人
Jun 19 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
Jul 31 Python
python3实现从kafka获取数据,并解析为json格式,写入到mysql中
Dec 23 Python
Python pandas库中的isnull()详解
Dec 26 Python
Windows下python3安装tkinter的问题及解决方法
Jan 06 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
Mar 14 Python
python opencv 实现读取、显示、写入图像的方法
Jun 08 Python
Django正则URL匹配实现流程解析
Nov 13 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 XML操作的各种方法解析(比较详细)
2010/06/17 PHP
PHP中的替代语法介绍
2015/01/09 PHP
php实现图片局部打马赛克的方法
2015/02/11 PHP
Yii2 如何在modules中添加验证码的方法
2017/06/19 PHP
PHP自定义错误处理的方法分析
2018/12/19 PHP
PHP const定义常量及global定义全局常量实例解析
2020/05/28 PHP
jQuery插件 tabBox实现代码
2010/02/09 Javascript
Javascript 检测键盘按键信息及键码值对应介绍
2013/01/03 Javascript
ExtJs中gridpanel分组后组名排序实例代码
2013/12/02 Javascript
动态创建script标签实现跨域资源访问的方法介绍
2014/02/28 Javascript
jquery动态添加删除一行数据示例
2014/06/12 Javascript
js实现从数组里随机获取元素
2015/01/12 Javascript
微信小程序 基础知识css样式media标签
2017/02/15 Javascript
PHP实现本地图片上传和验证功能
2017/02/27 Javascript
JS实现闭包中的沙箱模式示例
2017/09/07 Javascript
微信小程序基于picker实现级联菜单
2019/02/15 Javascript
详解如何更好的使用module vuex
2019/03/27 Javascript
vue更改数组中的值实例代码详解
2020/02/07 Javascript
教你如何将 Sublime 3 打造成 Python/Django IDE开发利器
2014/07/04 Python
Python发送Email方法实例
2014/08/21 Python
python使用numpy读取、保存txt数据的实例
2018/10/14 Python
python 类的继承 实例方法.静态方法.类方法的代码解析
2019/08/23 Python
python中利用numpy.array()实现俩个数值列表的对应相加方法
2019/08/26 Python
解决Jupyter Notebook开始菜单栏Anaconda下消失的问题
2020/04/13 Python
详解selenium + chromedriver 被反爬的解决方法
2020/10/28 Python
canvas 绘图时位置偏离的问题解决
2020/09/16 HTML / CSS
美国网上花店:JustFlowers
2017/02/12 全球购物
印度和世界各地的精美产品:Ikka Dukka
2018/02/12 全球购物
2013年军训通讯稿
2014/02/05 职场文书
2014年教师节红领巾广播稿
2014/09/10 职场文书
工会2014法制宣传日活动总结
2014/11/01 职场文书
小学少先队工作总结2015
2015/05/26 职场文书
个人收入证明格式
2015/06/24 职场文书
六一儿童节致辞稿(3篇)
2019/07/11 职场文书
大学学生会主席竞选稿怎么写?
2019/08/19 职场文书
React如何使用axios请求数据并把数据渲染到组件
2022/08/05 Javascript