python 基于内容的推荐系统(不到40行代码用Python实现一个简单的推荐系统)
python 基于内容的推荐系统
不到40行代码用Python实现一个简单的推荐系统什么是推荐系统
维基百科这样解释道:推荐系统属于资讯过滤的一种应用。推荐系统能够将可能受喜好的资讯或实物(例如:电影、电视节目、音乐、书籍、新闻、图片、网页)推荐给使用者。
本质上是根据用户的一些行为数据有针对性的推荐用户更可能感兴趣的内容。比如在网易云音乐听歌,听得越多,它就会推荐越多符合你喜好的音乐。
推荐系统是如何工作的呢?有一种思路如下:
用户 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 ); |
上图是电影被评分次数的直方图,可以看到大量的电影评分次数不足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) 高相关的电影列表。但是高相关有可能评分低(概率低),再从列表里挑几部平均得分高的电影推荐就好了。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对开心学习网的支持。
原文链接:https://juejin.im/post/5cb53b64f265da03540300c6
- python关闭程序强制退出线程(python多线程调用exit无法退出的解决方法)
- python批量注册(python实现批量注册网站用户的示例)
- python中if判断数据类型(基于python if 判断选择结构的实例详解)
- python函数基本使用(Python3中exp函数用法分析)
- python opencv图像合并(Python3+OpenCV2实现图像的几何变换平移、镜像、缩放、旋转、仿射)
- python无法拒绝的表白代码教程(很酷的python表白工具 你喜欢我吗)
- python3爬虫实例代码(python3通过selenium爬虫获取到dj商品的实例代码)
- pythonsocket建立多用户通讯(Python socket实现多对多全双工通信的方法)
- python爬取百度搜索pdf文档(Python实现的爬取百度文库功能示例)
- python做了一个自动翻译的小工具(Python 20行简单实现有道在线翻译的详解)
- python面向对象的介绍(Python面向对象思想与应用入门教程类与对象)
- python爬网验证码在哪里(详解python 爬取12306验证码)
- opencv人脸识别算法(python利用Opencv实现人脸识别功能)
- python可视化界面实现管理系统(python面向对象实现名片管理系统文件版)
- python中可以改变的数据类型(Python常见数据类型转换操作示例)
- python3.5 tkinter教程(解决python3.5 正常安装 却不能直接使用Tkinter包的问题)
- 巅峰时期被爆床照,曾被选国民最讨厌女星,IU不为人知的黑历史(巅峰时期被爆床照)
- 每天1万吨牛奶倒进下水道,美国大萧条一幕重现(每天1万吨牛奶倒进下水道)
- 如何看待美国数十万加仑牛奶倒下水道 历史又重演了(如何看待美国数十万加仑牛奶倒下水道)
- 历史惊人的相似,美国80万加仑牛奶倒入下水道,意味着什么(历史惊人的相似)
- 美国数十万加仑牛奶倒进下水道,世界会重演1929年的大萧条吗(美国数十万加仑牛奶倒进下水道)
- 美国数十万加仑牛奶倒入下水道,贫民区食不果腹,历史再次重演(美国数十万加仑牛奶倒入下水道)
热门推荐
- php连接mysql需要数据源吗(php连接mysql数据库最简单的实现方法)
- 服务器怎么创建网站(网站如何选择服务器空间?)
- sqlserver2016使用教程(SQL Server 2016 Alwayson新增功能图文详解)
- VS调试时无法命中断点
- div左右布局自适应(如何让一个div居于页面正中间实现方法)
- javascript中的this判定(Javascript中函数分类&this指向的实例详解)
- docker容器端口和内部进程(Docker动态给容器Container暴露端口操作)
- html5css3旋转特效效果(一款利用html5和css3实现的3D立方体旋转效果教程)
- python中字典的值怎么应用(对python中字典keys,values,items的使用详解)
- jquery属性选择器
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9