不到40行代码用Python实现一个简单的推荐系统

 更新时间:2019年05月10日 10:12:53   作者:U2FsdGVkX1x  
这篇文章主要给大家介绍了如何利用不到40行python代码实现一个简单的推荐系统,文中通过示例代码介绍的非常详细,对大家学习或者使用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) 高相关的电影列表。但是高相关有可能评分低(概率低),再从列表里挑几部平均得分高的电影推荐就好了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

相关文章

  • pandas中Series的代码实例解析

    pandas中Series的代码实例解析

    这篇文章主要介绍了pandas中Series的代码实例解析,Series序列,是一种一维的结构,类似于一维列表和ndarray中的一维数组,但是功能比他们要更为强大,Series由两部分组成:索引index和数值values,需要的朋友可以参考下
    2023-07-07
  • python pandas如何使用loc和iloc读取行数据或列数据

    python pandas如何使用loc和iloc读取行数据或列数据

    这篇文章主要给大家介绍了关于python pandas如何使用loc和iloc读取行数据或列数据的相关资料,在学习机器学习的过程中对数据进行预处理时避免不了需要使用Pandas进行大量操,需要的朋友可以参考下
    2023-10-10
  • Matplotlib实战之百分比柱状图绘制详解

    Matplotlib实战之百分比柱状图绘制详解

    百分比堆叠式柱状图是一种特殊的柱状图,可以用于可视化比较不同类别或组的百分比或比例的图表,下面我们就来介绍一下如何使用Matplotlib绘制百分比柱状图,需要的可以参考下
    2023-08-08
  • 10分钟用python搭建一个超好用的CMDB系统

    10分钟用python搭建一个超好用的CMDB系统

    这篇文章主要介绍了10分钟用python搭建一个超好用的CMDB系统,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Python使用django框架实现多人在线匿名聊天的小程序

    Python使用django框架实现多人在线匿名聊天的小程序

    很多网站都提供了在线匿名聊天的小功能,下面小编基于python的django框架实现一个多人在线匿名聊天的小程序,具体实现代码大家参考下本文
    2017-11-11
  • 在Python中使用代理IP的方法详解

    在Python中使用代理IP的方法详解

    在网络爬虫开发中,使用代理IP是非常常见的技巧,Python作为一门强大的编程语言,也提供了很多方法来使用代理IP,下面,我将就如何在Python中使用代理IP进行详细的阐述,并举例说明,需要的朋友可以参考下
    2023-07-07
  • 利用Python-iGraph如何绘制贴吧/微博的好友关系图详解

    利用Python-iGraph如何绘制贴吧/微博的好友关系图详解

    这篇文章主要给大家介绍了关于利用Python-iGraph如何绘制贴吧/微博好友关系图的相关资料,文中显示介绍了在windows系统下安装python-igraph的步骤,然后通过示例代码演示了绘制好友关系图的方法,需要的朋友可以参考下。
    2017-11-11
  • python脚本实现统计日志文件中的ip访问次数代码分享

    python脚本实现统计日志文件中的ip访问次数代码分享

    这篇文章主要介绍了python脚本实现统计日志文件中的ip访问次数代码分享,注意此脚本只适用ip在每行开头的日志文件,需要的朋友可以参考下
    2014-08-08
  • Python3 用matplotlib绘制sigmoid函数的案例

    Python3 用matplotlib绘制sigmoid函数的案例

    这篇文章主要介绍了Python3 用matplotlib绘制sigmoid函数的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • python代码有一行标黄问题的解决方案

    python代码有一行标黄问题的解决方案

    这篇文章主要介绍了python代码有一行标黄问题的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02

最新评论