怎样用python搭建简单的系统_如何用Python搭建一个简单的推荐系统?

本文使用的数据集是MovieLens数据集,该数据集由明尼苏达大学的Grouplens研究小组整理。它包含1,10和2亿个评级。 Movielens还有一个网站,我们可以注册,撰写评论并获得电影推荐。接下来我们就开始实战演练。

在这篇文章中,我们会使用Movielens构建一个基于item的简易的推荐系统。在开始前,第一件事就是导入pandas和numPy。

import pandas as pd import numpy as np import warnings warnings.filterwarnings('ignore')

接下来,我们使用pandas read_csv()加载数据集。数据集由制表符分隔,所以我们将\ t传递给sep参数。然后,使用names参数传入列名。

df = pd.read\_csv('u.data', sep='\\t', names=\['user\_id','item_id','rating','titmestamp'\])

接下来查看表头,检查一下正在处理的数据。

df.head()

如果我们能够看到电影的标题而不仅仅是ID,那再好不过了。之后加载电影标题并把它与此数据集合并。

movie\_titles = pd.read\_csv('Movie\_Titles') movie\_titles.head()

由于item_id列相同,我们可以在此列上合并这些数据集。

df = pd.merge(df, movie\_titles, on='item\_id') df.head()

数据集中的每一列分部代表:

•user_id - 评级电影的用户的ID。

•item_id - 电影的ID。

•rating - 用户为电影提供的评级,介于1和5之间。

•timestamp - 电影评级的时间。

•title- 电影标题。

使用describe或info命令,就可以获得数据集的简要描述。如果想要真正了解正在使用的数据集的话,这一点非常重要。

df.describe()

可以看出,数据集共有100003条记录,电影的平均评分介于3.52-5之间。

现在我们再创建一个dataframe,其中包含每部电影的平均评分和评分数量。之后,这些评分将用来计算电影之间的相关性。相关性是一种统计指标,表示两个或多个变量一起波动的程度。相关系数越高,电影越为相似。

以下例子将使用Pearson相关系数 (Pearson correlation coefficient),该数字介于-1和1之间,1表示正线性相关,-1表示负相关, 0表示没有线性相关。也就是说,具有零相关性的电影完全不相似。

我们会使用pandas groupby 功能来创建dataframe。按照标题对数据集进行分组,并计算其平均值获得每部电影的平均评分。

ratings = pd.DataFrame(df.groupby('title')\['rating'\].mean()) ratings.head()

接下来我们创建number_of_ratings列,这样就能看到每部电影的评分数量。完成这步操作后,就可以看到电影的平均评分与电影获得的评分数量之间的关系。五星级电影很有可能只被一个人评价,而这种五星电影在统计上是不正确的。

因此,在构建推荐系统时,我们需要设置阈值。我们可以使用pandas groupby功能来创建新列,然后按标题栏分组,使用计数函数计算每部电影的评分。之后,便可以使用head()函数查看新的dataframe。

rating \['number\_of\_ratings'\] = df.groupby('title')\['rating'\].count() ratings.head()

接下来我们使用pandas绘制功能来绘制直方图,显示评级的分布:

import matplotlib.pyplot as plt %matplotlib inline ratings\['rating'\].hist(bins=50)

可以看到,大多数电影的评分都在2.5-4之间。通过类似的方法还可以将number_of_ratings列可视化。

ratings\['number\_of\_ratings'\].hist(bins=60)

从上面的直方图中可以清楚地看出,多数电影的评分都很低,评分最高的电影是一些非常有名的电影。

现在让我们再来看一下电影评级与评分数量之间的关系。我们可以使用seaborn绘制散点图,然后使用jointplot()函数执行此操作。

import seaborn as sns sns.jointplot(x='rating', y='number\_of\_ratings', data=ratings)

从图中我们可以看出,电影平均评分与评分数量之间呈正相关关系,电影获得的评分数量越多,其平均评分越高。

创建基于item的简易推荐系统 接下来我们会快速创建一个基于item的简单的推荐系统。

首先,我们需要将数据集转换为矩阵,电影标题为列,user_id为索引,评级为值。完成这一步,我们将得到一个dataframe,其中列是电影标题,行是用户ID。每列代表所有用户对电影的所有评级。评级为NAN表示用户未对这部电影评分。

我们可以用该矩阵来计算单个电影的评级与矩阵中其余电影的相关性,该矩阵可以通过pandas pivot_table实现。

movie\_matrix = df.pivot\_table(index ='user\_id',columns ='title',values ='rating') movie\_matrix.head()

接下来让我们找到评分数量最多的电影,并选择其中的两部电影。然后使用pandas sort_values并将升序设置为false,以便显示评分最多的电影。然后使用head()函数来查看评分数目最多的前十部电影。

ratings.sort\_values('number\_of\_ratings', ascending=False).head(10)

假设一个用户曾看过Air Force One(1997)和Contact(1997),我们想根据这两条观看记录向该用户推荐其他类似的电影,那么这一点可以通过计算这两部电影的评级与数据集中其他电影的评级之间的相关性来实现。第一步是创建一个dataframe,其中包含来自movie_matrix的这些电影的评级。

AFO\_user\_rating = movie\_matrix\['Air Force One (1997)'\] contact\_user\_rating = movie\_matrix\['Contact (1997)'\] Dataframe

可以显示user_id和这两部电影的评分。

AFO\_user\_rating.head() contact\_user\_rating.head()

使用pandas corwith功能计算两个dataframe之间的相关性。有了这一步,就能够获得每部电影的评级与Air Force One电影的评级之间的相关性。

similar\_to\_air\_force\_one = movie\_matrix.corrwith(AFO\_user_rating)

可以看到,Air Force One电影和Till There Was You(1997)之间的相关性是0.867。这表明这两部电影之间有很强的相似性。

similar\_to\_air\_force\_one.head()

还可以计算Contact(1997)的评级与其他电影评级之间的相关性,步骤同上:

similar\_to\_contact = movie\_matrix.corrwith(contact\_user_rating)

可以从中发现,Contact(1997)和Till There Was You(1997)之间存在非常强的相关性(0.904)。

similar\_to\_contact.head()

前边已经提到,并非所有用户都对所有电影进行了评分,因此,该矩阵中有很多缺失值。为了让结果看起来更有吸引力,删除这些空值并将相关结果转换为dataframe。

corr\_contact = pd.DataFrame(similar\_to\_contact, columns=\['Correlation'\]) corr\_contact.dropna(inplace=True) corr\_contact.head()corr\_AFO = pd.DataFrame(similar\_to\_air\_force\_one, columns=\['correlation'\]) corr\_AFO.dropna(inplace=True) corr\_AFO.head()

上面这两个dataframe分别展示了与Contact(1997)和Air Force One(1997)电影最相似的电影。然而,问题出现了,有些电影的实际质量非常低,但可能因为一两位用户给他们5星评级而被推荐。

这个问题可以通过设置评级数量的阈值来解决。从早期的直方图中看到,评级数量从100开始急剧下降。因此可以将此设置为阈值,但是也可以考虑其他合适的值。为此,我们需要将两个dataframe与rating datframe中的number\_of\_ratings列一起加入。

corr\_AFO = corr\_AFO.join(ratings\['number\_of\_ratings'\]) corr\_contact = corr\_contact.join(ratings\['number\_of\_ratings'\])corr\_AFO.head()corr\_contact.head()

现在,我们就能得到与Air Force One(1997)最相似的电影,并把这些电影限制在至少有100条评论的电影中,然后可以按相关列对它们进行排序并查看前10个。

corr\_AFO \[corr\_AFO \['number\_of\_ratings'\]> 100\] .sort_values(by ='correlation',ascending = False).head(10)

我们注意到Air Force One(1997)与自身相关性最高,这并不奇怪。下一部与Air Force One(1997)最相似的电影是Hunt for Red October,相关系数为0.554。

显然,通过更改评论数量的阈值,我们可以按之前的方式得到不同的结果。限制评级数量可以让我们获得更好的结果。

现在重复上边的步骤,可以看到与Contact(1997)电影最相关的电影:

corr\_contact \[corr\_contact \['number\_of\_ratings'\]> 100\] .sort_values(by ='Correlation',ascending = False).head(10)

与Contact(1997)最相似的电影是Philadelphia(1993),相关系数为0.446,有137个评级。所以,如果有人喜欢Contact(1997),我们可以向他们推荐上述电影。

以上是构建推荐系统的一种非常简单的方法,但并不符合行业标准。后续的话我们可以通过构建基于存储器的协同过滤系统来改进该系统。在这种情况下,将数据划分为训练集和测试集,使用诸如余弦相似性来计算电影之间的相似性;或者构建基于模型的协作过滤系统,然后使用Root Mean Squared Error(RMSE)等技术评估模型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/488779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

垂直居中——登录界面

弹性盒子垂直居中&#xff1a;body直接display&#xff1a;flex不行中间在来一层。 1 <!DOCTYPE html>2 <html>3 <head>4 <meta charset"utf-8">5 <link rel"stylesheet" href"https://cdn.static.runoob.com/libs/bootst…

LeetCode 2942. 查找包含给定字符的单词

给你一个下标从 0 开始的字符串数组 words 和一个字符 x 。 请你返回一个 下标数组 &#xff0c;表示下标在数组中对应的单词包含字符 x 。 注意 &#xff0c;返回的数组可以是 任意 顺序。 示例 1&#xff1a; 输入&#xff1a;words [“leet”,“code”], x “e” 输出…

html的组织顺序是什么,css如何组织?

css如何组织&#xff1f;下面本篇文章给大家介绍一下。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对大家有所帮助。前端工程师在开发一个单页面或者小网站的时候有可能不会在意CSS的组织问题&#xff0c;但如果要开发一个中大型的网站&#xff0c;…

oracle IF_Oracle和MySQL的区别(持续更新)

近期工作中有接触Oracle&#xff0c;发现和MySQL还是有一些语法使用上的差别&#xff0c;将常用的、遇到的总结如下~~~1.oracle只能用单引号&#xff0c;mysql单引号&#xff0c;双引号都可以&#xff1b;2.oracle的group by中不能使用别名&#xff0c;mysql可以&#xff1b;3.…

北航、旷视联合,打造最强实时语义分割网络

来源&#xff1a;AI科技评论编辑&#xff1a;Camel导语&#xff1a;MSFNet在Cityscapes测试集上达到77.1%mIoU/41FPS&#xff08;注意是1024*2048&#xff09;&#xff0c;在Camvid测试集上达到75.4 mIoU/97FPS&#xff0c;是目前最强的实时语义分割网络。下面要介绍的论文由北…

oracle text类型_数据库的一些注入技巧Oracle

默认数据库SYSTEMSYSAUX注释--SELECT * FROM Users WHERE username OR11 -- AND password ;查询版本信息SELECT banner FROM v$version WHERE banner LIKE Oracle%;SELECT banner FROM v$version WHERE banner LIKE TNS%;SELECT version FROM v$instance;数据库凭证SELECT u…

Java 装箱和拆箱

转载于:https://www.cnblogs.com/jiangxifanzhouyudu/p/6629165.html

批量修改计算机用户名,域环境下批量修改计算机名

C:\Users\Administrator>netdomrenamecomputernn/newname:N143/userd:rw\administrator/passwordd:1qazWSX/usero:administrator/passwordo:1qazWSX/reboot:3格式&#xff1a;netdomrenamecomputer计算机名/newname:新计算机名/userd:域\用户名/passwordd:password|*/usero:…

中科院计算所关于“木兰”语言问题处理情况说明

来源&#xff1a;中国科学院计算技术研究所 近日&#xff0c;网上出现质疑“木兰”语言的信息。我所获知这一情况后高度重视。经所科研道德委员会初步调查&#xff0c;“木兰”语言系我所员工刘雷创办的中科智芯公司研发的面向青少年编程教育的集成化产品&#xff0c;该产品的开…

用python表白代码_如何用Python代码向心爱的姑娘花式表白?

刚好之前用turtle 写过一个https://www.zhihu.com/video/1058809172984004608 这是我当时自学python第二天写的一个&#xff0c;书上讲到了一个turtle模块&#xff0c;可以用来画一些简单的图&#xff0c;自己突发奇想就在纸上大概设计了一下图形&#xff0c;算了算长度后&…

ipv6抓包 tcpdump_网络抓包工具tcpdump图文教程

tcpdump工具可以将网络中传送的数据包完全截获下来提供分析。还支持网络层、协议、主机或端口的过滤&#xff0c;并提供and/or/not等逻辑语句来去掉无用的信息。通过本文可以熟悉TcpDump工具&#xff0c;对网络数据抓包不再难!1、首先是在Linux系统上安装tcpdump&#xff0c;通…

联想计算机不能进入系统桌面,联想电脑装系统,进不了PE桌面,怎么处理?

联想笔记本换成XP以后&#xff0c;不能进系统(也就是进不了桌面)的原因和处理方法如下&#xff1a;(1)第一个原因&#xff1a;就是硬盘模式不同&#xff0c;而导至的蓝屏现象&#xff0c;进不了系统。由于现在电脑的硬盘大部分都是串口硬盘&#xff0c;而普通的XP安装盘和GHOST…

CSS3 Flex布局(伸缩布局盒模型)学习

CSS3 Flex布局&#xff08;伸缩布局盒模型&#xff09;学习 转自&#xff1a;http://www.xifengxx.com/web-front-end/1408.html CSS2定义了四种布局&#xff1a;块布局、行内布局、表格布局盒定位布局。 CSS3引入了一种新的布局模式——Flexbox布局&#xff0c;即伸缩布局盒&a…

qtablewidget添加item不显示_企业微信聊天工具栏可以添加哪些应用?企业微信聊天工具栏不显示是什么原因?...

使用企业微信营销的朋友们应该都知道&#xff0c;企业微信有聊天侧边栏&#xff0c;我们可以在里面添加常用应用&#xff0c;提升运营效率&#xff0c;但是有很多用户反映&#xff0c;自己的企业微信中没有聊天工具栏&#xff0c;这是什么原因呢&#xff1f;这时可能有以下两种…

5G将如何推动未来十年智能城市的发展

来源&#xff1a; IEEE电气电子工程师过去十年的结束标志着部署5G的技术军备竞赛。移动运营商竞相安装网络基础设施&#xff0c;在澳大利亚、中国、韩国、瑞士和美国等数十个国家提供每秒超过1千兆的无线连接。但是&#xff0c;为什么这么匆忙&#xff1f;在2019年的IEEE GLOBE…

英语计算机房和操场怎么读,计算机房对我们学习帮助很大. the , in studies , computer , room , helps , lot , a , our , us...

书面表达(本题满分20分)假如你是阳光中学的李华&#xff0c;即将要毕业的你&#xff0c;对学习和生活了三年的母校充满了眷恋和感恩&#xff0c;想在当地报刊上发表一篇英语文章描述自己的母校。请根据以下提示&#xff0c;写一篇短文。学校 ①优美的学习环境。②现代化的操场。…

接口自动化- 基于 Python

准备工作 这部分其实在谷歌或者百度上搜索下就可以完成的&#xff0c;可是我就是想再啰嗦一遍&#xff0c;说不定有比我更懒的同学呢哈哈~ 第一步 Python的安装配置 打开官网: https://www.python.org/downloads/ 目前官网上已经更新到3.6.1啦&#xff08;这更新速度我是服的&…

msk 频偏_一种MSK-Type信号的频率同步改进算法

第 49 卷 第 11 期 2 0 1 7 年 11 月 哈 尔 滨 工 业 大 学 学 报 JOU&#xff32;NAL OF HA&#xff32;BIN INSTITUTE OF TECHNOLOGY Vol. 49 No. 11 Nov&#xff0e; 2017 DOI: 10&#xff0e;11918/j&#xff0e;issn&#xff0e;0367-6234&#xff0e;201608021 一种 MSK&…

vscode c++ 快捷键_[工具篇]提高开发幸福度的VSCode配置[更新中...]

工欲善其事&#xff0c;必先利其器。基于上文把keil与外部编辑器vscode结合一起&#xff0c;达到keil作为编译与调试工具&#xff0c;而vscode作为编辑工具&#xff0c;如今其插件之丰富能与vim媲美&#xff0c;所以现在本文主要介绍本人对VSCode的一些个性配置&#xff0c;以便…

【平行驾驶】王飞跃 | 人工智能与智能汽车:在CPSS中驶向第三轴心时代

来源&#xff1a;车百智库【导读】1月10-12日&#xff0c;2020中国电动汽车百人会论坛在钓鱼台国宾馆隆重召开。青岛智能产业技术研究院院长王飞跃教授受邀出席并作精彩报告&#xff0c;讲述了平行驾驶理论及其当前的矿山无人化应用。王飞跃教授表示&#xff0c;平行驾驶是一种…