movielens推荐系统_基于内容推荐(二)

7bec47e7c79a67e57279bc486a797a46.png

A content-based movie recommender system using MovieLens tags (用标签构建一个简单的电影推荐系统)

现在有很多电影。如果没有某种推荐系统,您会担心,随着时间的流逝,用户可能会被他们不关心的电影所淹没。因此,您决定构建电影推荐系统。由于您的服务是新服务,因此您没有足够的数据来了解哪些用户正在观看哪些电影。这被称为冷启动问题,它使您无法仅根据用户的历史收视率来推荐电影。幸运的是,即使没有足够的收视数据,我们仍然可以使用电影元数据构建一个不错的推荐系统。这就是MovieLens的用处。MovieLens为每个电影提供带有关键字标签的公共数据集。这些标签非常有用。

这个转化单功能多个分类值的办法十分有用,整个数据集整理完之后为:

76e8deb9d72237d9193e2baa823639bf.png

Source: https://datascience.stackexchange.com/questions/14847/multiple-categorical-values-for-a-single-feature-how-to-convert-them-to-binary-u

在本文的其余部分中,我将回答三个业务问题,这些问题对于使用MovieLens的标签构建基于内容的简单推荐系统至关重要:

  1. 每部电影需要几个标签?
  2. 我们如何使用标签来衡量电影之间的相似性?
  3. 我们如何使用标签为用户生成电影推荐?

第一个问题:每部电影需要几个标签?

MovieLens标签基因组数据集中大约有10万部唯一电影和一千个唯一标签。每部电影对每个标签都有一个相关性得分,因此大约有1000万个电影标签对,取值区间从0到1。但是并非每个标签都与电影相关,因此我们只需要保留最相关的标签。首先,我们可以根据相关性得分对每部电影的标签进行排序。以玩具总动员为例:

e22a46cee3e001102583f08961c67d58.png

接下来,我们在下面的图表中确认,电影排名较高的标签通常具有较高的中位数相关性突出。电影的第1级标签的中位相关性几乎几乎为1。我们可以看到, 随着大约第50级,中位相关性逐渐降低。

8530fb9b1b981e4eeacf175fdfb14998.png

要查找电影的最相关标签,我们可以根据相关性得分保留电影的前N个标签。在这里,我们需要仔细选择N。如果N很小,则我们具有非常相关的标签。如果N大,则我们有很多标签,但其中许多标签可能无关紧要。下图显示了当我们从排名第1升至第100时,中位数相关性得分的变化百分比。当相关性得分开始变得更加稳定时,我们会在第50个等级附近看到一个拐点。因此,我们可以选择N = 50作为每个电影要保留的合理数量的标签。请注意,这是一种非常简单的“弯头方法”样式的方法,以后可以对其进行优化。

d42e62ba5e9385cccf419d39f4ec5a66.png

现在,我们可以获得每部电影的前50个标签的列表,这些标签将在下一部分中使用。例如,玩具总动员的50个标签。

0c9d11a7acd5b52fe6beaa91751da707.png

另外可以根据电影的名称来查询标签

c38706885977b020b843496bfcc6e1d7.png

第二个问题:我们如何使用标签来衡量电影之间的相似性?

在为用户生成电影推荐之前,我们需要一种基于电影的前50个标签来衡量电影之间相似度的方法。在基于内容的推荐器系统中,将向用户推荐与他们已经看过的电影相似的电影。

在这里,我将演示两种测量相似度的方法:

  1. 两组电影标签的Jaccard系数
  2. 基于标签的电影矢量(也称为内容嵌入)的余弦相似度

Jaccard 系数:

使用Jaccard Index的第一种方法是将两个集合AB之间的相似度作为交集的大小除以并集的大小。在衡量电影之间的相似性时,我们可以为两组电影标签计算此索引。

20d28614a3e888913c5757c70b1c5d98.png

例如,假设我们下面有三部电影,以及前三部标签:

  • 电影A标签=(动作,空间,友谊)
  • 电影B标签=(冒险,太空,友谊)
  • 电影C标签=(浪漫,喜剧,成年)

直观地看,电影A与电影B相似,这是因为电影A和电影B共享两个标签(空格,友谊),而电影A和电影C没有共享标签。以下是根据Jaccard Index进行的类似于心灵捕手的前十部电影。 对于善意狩猎的观众来说,这些看起来像是合理的建议。 请注意,我在列表中包括了心灵捕手,以表明在将电影与其自身进行比较时,Jaccard Index = 1。

e7ccf7b663425c24a8237fdf8d157ad8.png

根据Jaccard 系数,与《星际穿越》相似的前十部电影以下。 对于《星际穿越》的观众来说,这些看起来也很合理。

5144f750b67fe362596570a2fec02d29.png

为了进一步说明“ Jaccard Index”的有效性,请参见下文基于类似于《星际穿越》电影的标签频率的词云。 在这里,我们可以看到哪些标签在相似度计算中更为突出(例如科幻小说,伟大的结局,错位的未来,哲学的,大脑的)。

82c07c2755c23d9d2fb76a30dcb10a86.png

余弦相似度(Cosine Similarity)

Jaccard Index的第一种方法帮助我们建立了与标签相似意味着什么的直觉。 这里余弦相似度的第二种方法稍微复杂一些。 它要求我们将电影表示为矢量。 在这里,向量只是一组数字。

例如,我们可以用三个实数表示同一部电影:

电影A =(1.1,2.3,5.1)

电影B =(1.3,2.1,4.9)

电影C =(5.1,6.2,1.1)

凭直觉,我们再次可以看到电影A与电影B的相似度高于电影B,这是因为电影A和电影B在每个维度上的数字都更接近(例如,在第一维度上的数字是1.1与1.3)。为了找到电影的良好矢量表示,我使用本文中的Doc2Vec(PV-DBOW)技术拍摄电影(文档),并根据其标签(文档中的单词)学习到潜在K维矢量空间的映射。

16986228b2f975d1e2de424c53a15cdf.png

Doc2Vec论文中PV-DBOW技术的可视化; 对于每个段落ID(电影),我们正在训练一个模型来预测该段落中单词(电影标签)的出现

一旦我们可以将每个电影表示为矢量,就可以计算矢量之间的余弦相似度,以找到相似的电影。 我不会在这里详细介绍余弦相似度,但是从较高的角度讲,它可以告诉我们彼此之间相似的电影矢量之间的相似度,我们可以使用它们来生成推荐。 下面,我使用UMAP可视化二维的电影矢量,这是一种流行的非线性降维技术。 我们可以看到在此向量空间中距离更近的电影更加相似(例如玩具总动员和怪物工厂)。

8722e902441cf67ab1acdfb8f7522b0a.png

第三个问题:我们如何使用标签为用户生成电影推荐?

现在,我们可以测量带有标签的电影之间的相似性,我们可以开始向用户生成电影推荐。请记住,在基于内容的推荐器系统中,将向用户推荐与他们已经看过的电影相似的电影。如果用户仅看过一部电影(例如心灵捕手),我们可以像以前一样简单地使用Jaccard索引(或余弦相似度)来生成要推荐的类似电影的列表。

实际上,用户将观看一组电影,我们需要根据这些电影的组合属性生成推荐。 一种简单的方法是将用户矢量计算为他们看过的电影矢量的平均值。 这些用户向量可以代表用户的电影偏好设置。

例如,如果用户只看了下面的电影A和B:

电影A =(1、2、3)

电影B =(7,2,1)

用户向量=电影A和电影B的平均值=(4、2、2)

以下是我观看和欣赏的电影,包括星际穿越、心灵捕手、千钧一发、几乎成名、肖申克的救赎、明日边缘、甜心先生、阿甘正传和回到未来。我们如何使用这些电影中的标签生成电影推荐呢?我的用户向量将是上述九部电影的电影向量的平均值。 我可以利用用户向量来查找尚未观看的最相似的电影(基于余弦相似度)。 考虑到我们仅在这里使用电影标签,以下是我的电影推荐,这些推荐出奇的好!

6aa4b80775c1458c9f714edd8d33525b.png

以下是我们基于内容的推荐系统的摘要。 请注意,如果我们将系统部署为API,则可以在批处理过程中预先计算用户向量和相似性分数,以加快建议的提供。

输入:用户向量(从标记中学到的电影向量的平均值)

输出:基于用户和电影向量的余弦相似度,与用户相似的电影列表

Source: Johnson Kuan, 2019. How to Build a Simple Movie Recommender System with Tags. Available from: https://towardsdatascience.com/how-to-build-a-simple-movie-recommender-system-with-tags-b9ab5cb3b616 [25 June 2020]

个人Github :

非商业应用,仅用于学术分享,侵权删

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

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

相关文章

全国计算机等级考试题库二级C操作题100套(第61套)

第61套: 函数fun的功能是进行字母转换。若形参ch中是小写英文字母,则转换成对应的大写英文字母;若ch中是大写英文字母,则转换成对应的小写英文字母;若是其它字符则保持不变;并将转换后的结果作为函数值返回。 请在程序…

phpcms毛遂

1.showmessage()showmessage(L(operation_success),?mlink&clink&aedit,, edit);edit>关闭对象showmessage(L(operation_failure));showmessage(L(operation_false),HTTP_REFERER);2.formValidator3.update()$dataarray(nickname>$_POST[nickname],contact>$…

android java 指针,opencv android:向我的代码中添加cascade分类器后出现空指针异常

我在casecadeclassifier.java类中收到空指针异常在这里:Mat objects_mat objects;detectMultiScale_4(nativeObj, image.nativeObj, objects_mat.nativeObj, scaleFactor);这是我的日志:02-11 20:53:15.209 10968-10968/? E/SystemUpdate-ReflectUtils: getClass android.pro…

HALCON 1D Measure 算子初识

基本上1D Measure都是建立一个ROI(region of interest,感兴趣区域),然后在感兴趣区域提取出边界的测量。常见的ROI有矩形ROI和圆环ROI。 下图为一个矩形ROI,中间的Profile Line为横截线,Center是行和列的坐标,Phi指定了…

python可视化界面编程 pycharm_pycharm开发一个简单界面和通用mvc模板(操作方法图解)...

文章首先使用pycharm的 PyQt5 Designer 做一个简单的界面,然后引入所谓的“mvc框架”。 一、设计登录界面 下面开始第一个话题,使用pycharm的 PyQt5 Designer 做一个简单的界面。 上一篇最后,在pycharm中配置了PyQt5 Designer 和 uic&#xf…

全国计算机等级考试题库二级C操作题100套(第62套)

第62套: 给定程序中,函数fun的功能是:把形参s所指字符串中下标为奇数的字符右移到下一个奇数位置,最右边被移出字符串的字符绕回放到第一个奇数位置,下标为偶数的字符不动(注:字符串的长度大于…

编译apache过程中出现如下错误及解决办法

在编译apache的过程中出现如下错误:no SSL-C headers foundconfigure: error: ...No recognized SSL/TLS toolkit detected解决办法:安装openssl-devel转载于:https://blog.51cto.com/tibet/1153481

tensorflow学习笔记七----------卷积神经网络

卷积神经网络比神经网络稍微复杂一些,因为其多了一个卷积层(convolutional layer)和池化层(pooling layer)。 使用mnist数据集,n个数据,每个数据的像素为28*28*1784。先让这些数据通过第一个卷积层,在这个卷积上指定一个3*3*1的fe…

matlab strfind用法,findstr和strfind区别

matlab中这两个字符串查找的函数findstr(), strfind()表明上看起来用法相似,效果也相似。一. findstr(s1,s2)--在较长的字符串中查找较短的字符串出现的次数,并返回其位置,因此无论s1,s2哪个为长字符串,位置在前在后都没有关系。例…

python发邮件给女朋友代码_python实现邮件发送完整代码(带附件发送方式)

实例一:利用SMTP与EMAIL实现邮件发送,带附件(完整代码) __author__ Administrator #codinggb2312 from email.Header import Header from email.MIMEText import MIMEText from email.MIMEMultipart import MIMEMultipart import…

Ubuntu识别USB设备

参考:如何解决Ubuntu无法识别USB设备 作者:一只青木呀 发布时间:2020-08-28 21:02:00 网址:https://blog.csdn.net/weixin_45309916/article/details/108286829 目录1、U盘识别2、识别转换解决Ubuntu无法识别USB3.0方法一&#xf…

用ElasticSearch存储日志

介绍 如果你使用elasticsearch来存储你的日志,本文给你提供一些做法和建议。 如果你想从多台主机向elasticsearch汇集日志,你有以下多种选择: Graylog2 安装在一台中心机上,然后它负责往elasticsearch插入日志,而且你可…

解除单个文件的与svn服务器的关联

有些文件和个人开发环境有关不需要和svn服务器做同步,可以取消其和svn服务的关联。 右键选中要取消关联的文件,右键菜单 Tortoise SVN ---> unversion and add to ignore list 确定后,文件图标会变成一把小剪刀,说明已经…

java xml出错,Java xml出现错误 javax.xml.transform.TransformerException: java.lang.NullPointerException...

Java xml出现错误 javax.xml.transform.TransformerException: java.lang.NullPointerException解决办法:利用Java操作XML,在操作XML过程中,执行到最后一步,在利用Transformer进行XML转换时出现NullPointerException错误&#xff…

Ubuntu磁盘扩容及启动问题整理

参考:Ubuntu磁盘扩容及启动问题整理 作者:一只青木呀 发布时间: 2020-12-08 10:42:19 网址:https://blog.csdn.net/weixin_45309916/article/details/110850358 也可参照正点原子的:Ubuntu磁盘空间不足?一招…

函数求值需要运行所有线程_精读《深度学习 - 函数式之美》

1 引言函数式语言在深度学习领域应用很广泛,因为函数式与深度学习模型的契合度很高,The Beauty of Functional Languages in Deep Learning — Clojure and Haskell 就很好的诠释了这个道理。通过这篇文章可以加深我们对深度学习与函数式编程的理解。2…

IOS(常用移动终端设备) push实现通知中心

参考文章: http://blog.csdn.net/zhuqilin0/article/details/6527113 http://www.dozer.cc/2013/03/push-notifications-server-side-implement/ http://blog.sina.com.cn/s/blog_71ce775e0101b43e.html PushSharp:https://github.com/Redth/PushShar…

Ubuntu下无法看到共享文件夹的解决办法

参考:Ubuntu下无法看到共享文件夹的解决办法 作者:一只青木呀 发布时间:2020-08-07 10:09:04 网址:https://blog.csdn.net/weixin_45309916/article/details/107856157 今天早上起来突然发现共享文件夹的查看不到了,找…

MySQL提供了以下三种方法用于获取数据库对象的元数据

MySQL提供了以下三种方法用于获取数据库对象的元数据: 1)show语句 2)从INFORMATION_SCHEMA数据库里查询相关表 3)命令行程序,如mysqlshow, mysqldump 用SHOW语句获取元数据 MySQL用show语句获取元数据是最常用的方法&a…

laravel 5.1 php版本号,发行版本说明 | 序言 | Laravel 5.1 中文文档

发行版本说明由 学院君 创建于5年前, 最后更新于 11个月前版本号 #219641 views23 likes0 collects支持政策LTS版本,比如Laravel 5.1,将会提供两年的bug修复和三年的安全修复支持。这些版本将会提供最长时间的支持和维护。对于其他通用版本,只…