不到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基础教程之实现石头剪刀布游戏示例
Feb 11 Python
利用Python中的mock库对Python代码进行模拟测试
Apr 16 Python
谈谈Python进行验证码识别的一些想法
Jan 25 Python
python实现简单点对点(p2p)聊天
Sep 13 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
Mar 14 Python
python针对Oracle常见查询操作实例分析
Apr 30 Python
新版Pycharm中Matplotlib不会弹出独立的显示窗口的问题
Jun 02 Python
pytorch cuda上tensor的定义 以及减少cpu的操作详解
Jun 23 Python
PyTorch的torch.cat用法
Jun 28 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
Jun 30 Python
python使用隐式循环快速求和的实现示例
Sep 11 Python
python通过opencv调用摄像头操作实例分析
Jun 07 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
laravel中的一些简单实用功能
2018/11/03 PHP
php使用json-schema模块实现json校验示例
2019/09/28 PHP
javascript div 遮罩层封锁整个页面
2009/07/10 Javascript
asp.net下利用js实现返回上一页的实现方法小集
2009/11/24 Javascript
JS性能优化笔记搜索整理
2013/08/21 Javascript
jquery 取子节点及当前节点属性值
2014/07/25 Javascript
Javascript中的默认参数详解
2014/10/22 Javascript
举例讲解AngularJS中的模块
2015/06/17 Javascript
JavaScript判断表单为空及获取焦点的方法
2016/02/12 Javascript
提高Web性能的前端优化技巧总结
2017/02/27 Javascript
jquery与js实现全选功能的区别
2017/06/11 jQuery
基于JavaScript实现弹幕特效
2020/08/27 Javascript
JavaScrip数组删除特定元素的几种方法总结
2017/09/06 Javascript
JavaScript中错误正确处理方式小结你用对了吗
2017/10/10 Javascript
详解如何使用webpack打包JS
2018/06/21 Javascript
JavaScript设计模式之职责链模式应用示例
2018/08/07 Javascript
泛谈JS逻辑判断选择器 || &&
2019/05/24 Javascript
angularjs模态框的使用代码实例
2019/12/20 Javascript
Vue项目结合Vue-layer实现弹框式编辑功能(实例代码)
2020/03/11 Javascript
[56:29]Secret vs Optic 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python实现的下载8000首儿歌的代码分享
2014/11/21 Python
深入理解Python变量与常量
2016/06/02 Python
Python编程求解二叉树中和为某一值的路径代码示例
2018/01/04 Python
python使用Tkinter实现在线音乐播放器
2018/01/30 Python
python无限生成不重复(字母,数字,字符)组合的方法
2018/12/04 Python
基于python3的socket聊天编程
2020/02/17 Python
parser.add_argument中的action使用
2020/04/20 Python
浅析Python requests 模块
2020/10/09 Python
CSS3+Sprite实现僵尸行走动画特效源码
2016/01/27 HTML / CSS
IGK Hair官网:喷雾、洗发水、护发素等
2020/11/03 全球购物
餐饮业会计岗位职责
2013/12/19 职场文书
创业计划书如何吸引他人眼球
2014/01/10 职场文书
社区春季防火方案
2014/06/02 职场文书
教育实践活动对照检查材料
2014/09/23 职场文书
vue3中provide && inject的使用
2021/07/01 Vue.js
Java时间工具类Date的常用处理方法
2022/05/25 Java/Android