Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >python推荐系统实现(矩阵分解来协同过滤)|附代码数据

python推荐系统实现(矩阵分解来协同过滤)|附代码数据

原创
作者头像
拓端
发布于 2023-05-12 13:52:59
发布于 2023-05-12 13:52:59
9020
举报
文章被收录于专栏:拓端tecdat拓端tecdat

原文链接:http://tecdat.cn/?p=10911

最近我们被客户要求撰写关于推荐系统的研究报告,包括一些图形和统计输出。

用户和产品的潜在特征编写推荐系统矩阵分解工作原理使用潜在表征来找到类似的产品

1. 用户和产品的潜在特征

我们可以通过为每个用户和每部电影分配属性,然后将它们相乘并合并结果来估计用户喜欢电影的程度。

相同的计算可以表示为矩阵乘法问题。首先,我们把用户属性放在一个名为U的矩阵中,在这个例子中是5,-2,1,-5和5。然后,我们把电影属性放在一个名为M的矩阵中,我们使用矩阵乘法来找出用户的评分。

但要做到这一点,我们必须已经知道用户属性和电影属性。为每个用户和每部电影提供属性评级并不容易。我们需要找到一种自动的方法。我们来看看电影评分矩阵,

它显示了我们数据集中的所有用户如何评价电影。这个矩阵非常稀疏,但它给了我们很多信息。例如,我们知道用户ID2给电影1号五颗星。所以,基于此,我们可以猜测,这个用户的属性可能类似于电影的属性,因为它们匹配的很好。换句话说,我们有一些线索可以使用。

让我们看看我们如何利用这些线索来了解每部电影和每个用户。在我们刚刚看到的等式中,U乘M等于电影等级,我们已经知道一些用户的实际电影等级。我们已经拥有的电影评分矩阵是我们方程式的解决方案。虽然它是解决方案的一部分,但是这个阵列仍然有很多漏洞,但对于我们来说,这已经足够了。

实际上,我们可以使用目前为止我们所知道的电影评级,然后逆向找到满足该等式的U矩阵和M矩阵。当然,这才是最酷的部分。当我们将U和M相乘时,他们实际上会给我们一个完整的矩阵,我们可以使用那个完成的矩阵来推荐电影。让我们回顾一下我们将如何构建这个推荐系统。

首先,我们创建了我们在数据集中所有用户评论的矩阵。接下来,我们从已知的评论中分解出一个U矩阵和一个M矩阵。最后,我们将把我们找到的U和M矩阵相乘,得到每个用户和每部电影的评分。但是还有一个问题。以前,当我们为每个用户和每部电影手工创建属性时,我们知道每个属性的含义。我们知道第一个属性代表动作,第二个代表剧情,等等。但是当我们使用矩阵分解来提出U和M时,我们不知道每个值是什么意思。我们所知道的是,每个价值都代表了一些让用户感觉被某些电影吸引的特征。我们不知道如何用文字来描述这些特征。因此,U和M被称为潜在向量。潜在的词意味着隐藏。换句话说,这些向量是隐藏的信息,我们通过查看评论数据和反向推导。


混合IBCF协同过滤推荐算法推荐引擎的探索

01

02

03

04

2. 编写推荐系统

我们来编写推荐系统的主要代码。打开Chapter 5/factor_review_matrix.py。首先,我将使用pandas read_csv函数将检查数据集加载到名为raw_dataset_df的数据集中。

然后我们使用pandas数据透视表函数来构建评论矩阵。在这一点上,ratings_df包含一个稀疏的评论阵列。

接下来,我们希望将数组分解以找到用户属性矩阵和我们可以重新乘回的电影属性矩阵来重新创建收视率数据。为此,我们将使用低秩矩阵分解算法。我已经在matrix_factorization_utilities.py中包含了这个实现。我们将在下一个视频中详细讨论它是如何工作的,但让我们继续使用它。首先,我们传递了评分数据,但是我们将调用pandas的as_matrix()函数,以确保我们作为一个numpy矩阵数据类型传入。

接下来,这个方法接受一个名为num_features的参数。Num_features控制为每个用户和每个电影生成多少个潜在特征。我们将以15为起点。这个函数还有个参数regularization_amount。现在让我们传入0.1。在后面的文章中我们将讨论如何调整这个参数。

函数的结果是U矩阵和M矩阵,每个用户和每个电影分别具有15个属性。现在,我们可以通过将U和M相乘来得到每部电影的评分。但不是使用常规的乘法运算符,而是使用numpy的matmul函数,所以它知道我们要做矩阵乘法。

结果存储在一个名为predicted_ratings的数组中。最后,我们将predict_ratings保存到一个csv文件。

首先,我们将创建一个新的pandas数据框来保存数据。对于这个数据框,我们会告诉pandas使用与ratings_df数据框中相同的行和列名称。然后,我们将使用pandas csv函数将数据保存到文件。运行这个程序后可以看到,它创建了一个名为predicted_ratings.csv的新文件。我们可以使用任何电子表格应用程序打开该文件。

这个数据看起来就像我们原来的评论数据,现在每个单元格都填满了。现在我们评估下每个单个用户会为每个单独的电影评分。例如,我们可以看到用户3评级电影4,他们会给它一个四星级的评级。现在我们知道所有这些评分,我们可以按照评分顺序向用户推荐电影。让我们看看用户1号,看看我们推荐给他们的电影。在所有这些电影中,如果我们排除了用户以前评价过的电影,右边34号电影是最高分的电影,所以这是我们应该推荐给这个用户的第一部电影。当用户观看这部电影时,我们会要求他们评分。如果他们的评价与我们预测的不一致,我们将添加新评级并重新计算此矩阵。这将有助于我们提高整体评分。我们从中获得的评分越多,我们的评分阵列中就会出现的孔越少,我们就有更好的机会为U和M矩阵提供准确的值。

3. 矩阵分解工作原理

因为评分矩阵等于将用户属性矩阵乘以电影属性矩阵的结果,所以我们可以使用矩阵分解反向工作以找到U和M的值。在代码中,我们使用称为低秩矩阵分解的算法,去做这个。我们来看看这个算法是如何工作的。矩阵分解是一个大矩阵可以分解成更小的矩阵的思想。所以,假设我们有一个大的数字矩阵,并且假设我们想要找到两个更小的矩阵相乘来产生那个大的矩阵,我们的目标是找到两个更小的矩阵来满足这个要求。如果您碰巧是线性代数的专家,您可能知道有一些标准的方法来对矩阵进行因式分解,比如使用一个称为奇异值分解的过程。但是,这是有这么一个特殊的情况下,将无法正常工作。问题是我们只知道大矩阵中的一些值。大矩阵中的许多条目是空白的,或者用户还没有检查特定的电影。所以,我们不是直接将评级数组分成两个较小的矩阵,而是使用迭代算法估计较小的矩阵的值。我们会猜测和检查,直到我们接近正确的答案。哎哎等等, 咋回事呢?首先,我们将创建U和M矩阵,但将所有值设置为随机数。因为U和M都是随机数,所以如果我们现在乘以U和M,结果是随机的。下一步是检查我们的计算评级矩阵与真实评级矩阵与U和M的当前值有多不同。但是我们将忽略评级矩阵中所有没有数据的点,只看在我们有实际用户评论的地方。我们将这种差异称为成本。成本就是错误率。接下来,我们将使用数字优化算法来搜索最小成本。数值优化算法将一次调整U和M中的数字。目标是让每一步的成本函数更接近于零。我们将使用的函数称为fmin_cg。它搜索使函数返回最小可能输出的输入。它由SciPy库提供。最后,fmin_cg函数将循环数百次,直到我们得到尽可能小的代价。当成本函数的价值如我们所能得到的那样低,那么U和M的最终值就是我们将要使用的。但是因为它们只是近似值,所以它们不会完全完美。当我们将这些U矩阵和M矩阵相乘来计算电影评级时,将其与原始电影评级进行比较,我们会看到还是有一些差异。但是只要我们接近,少量的差异就无关紧要了。

4. 使用潜在特征来找到类似的产品

搜索引擎是用户发现新网站的常用方式。当第一次用户从搜索引擎访问您的网站时,您对用户尚不足以提供个性化推荐,直到用户输入一些产品评论时,我们的推荐系统还不能推荐他们。在这种情况下,我们可以向用户展示与他们已经在查看的产品类似的产品。目标是让他们在网站上,让他们看更多的产品。你可能在网上购物网站上看到过这个功能,如果你喜欢这个产品,你可能也会喜欢这些其他的产品。通过使用矩阵分解计算产品属性,我们可以计算产品相似度。让我们来看看find_similar_products.py。首先,我们将使用pandas的读取CSV功能加载电影评级数据集。

我们还会使用read_csv将movies.csv加载到名为movies_df的数据框中。

然后,我们将使用pandas的数据透视表函数(pivot_table)来创建评分矩阵,我们将使用矩阵分解来计算U和M矩阵。现在,每个电影都由矩阵中的一列表示。首先,我们使用numpy的转置函数来触发矩阵,使每一列变成一行。

这只是使数据更容易处理,它不会改变数据本身。在矩阵中,每个电影有15个唯一的值代表该电影的特征。这意味着其他电影几乎相同的电影应该是非常相似的。要找到类似这个电影的其他电影,我们只需要找到其他电影的编号是最接近这部电影的数字。这只是一个减法问题。让我们选择用户正在看的主要电影,让我们选择电影ID5。

如果你喜欢,你可以选择其他的电影。现在,我们来看看电影ID5的标题和流派。我们可以通过查看movies_df数据框并使用pandas的loc函数通过其索引查找行来做到这一点。让我们打印出该电影的标题和流派。

接下来,让我们从矩阵中获取电影ID为5的电影属性。我们必须在这里减去一个,因为M是0索引,但电影ID从1开始。现在,让我们打印出这些电影属性,以便我们看到它们,这些属性我们准备好找到类似的电影。

第一步是从其他电影中减去这部电影的属性。这一行代码从矩阵的每一行中分别减去当前的电影特征。这给了我们当前电影和数据库中其他电影之间的分数差异。您也可以使用四个循环来一次减去一个电影,但使用numpy,我们可以在一行代码中完成。第二步是取我们在第一步计算出的差值的绝对值,numpy的ABS函数给我们绝对值,这只是确保任何负数出来都是正值。接下来,我们将每个电影的15个单独的属性差异合并为一个电影的总差异分数。numpy的总和功能将做到这一点。我们还会传入访问权限等于一个来告诉numpy总结每行中的所有数字,并为每行产生一个单独的总和。在这一点上,我们完成了计算。我们只是将计算得分保存回电影列表中,以便我们能够打印每部电影的名称。在第五步中,我们按照我们计算的差异分数对电影列表进行排序,以便在列表中首先显示最少的不同电影。这里pandas提供了一个方便的排序值函数。最后,在第六步中,我们打印排序列表中的前五个电影。这些是与当前电影最相似的电影。

好的,我们来运行这个程序。我们可以看到我们为这部电影计算的15个属性。这是我们发现的五个最相似的电影。第一部电影是用户已经看过的电影。接下来的四部电影是我们向用户展示的类似项目。根据他们的头衔,这些电影看起来可能非常相似。他们似乎都是关于犯罪和调查的电影。续集,大城市法官三,都在名单上。这是用户可能也会感兴趣的电影。您可以更改电影ID并再次运行该程序,以查看与其他电影类似的内容。


本文摘选 python机器学习:推荐系统实现(以矩阵分解来协同过滤)


原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
初学者指南:利用SVD创建推荐系统
作者:Mayukh Bhattacharyya 翻译:老齐 序言 你是否有过这样的经历:前一天晚上登录Netflix,观看了《星际穿越》,他们会建议你看《地心引力》。或者你在亚马逊上购买了东西,看到
老齐
2020/08/28
7070
初学者指南:利用SVD创建推荐系统
推荐系统实战-基于用户的协同过滤
1、数据集简介 MovieLens数据集包含多个用户对多部电影的评级数据,也包括电影元数据信息和用户属性信息。 这个数据集经常用来做推荐系统,机器学习算法的测试数据集。尤其在推荐系统领域,很多著名论文都是基于这个数据集的。(PS: 它是某次具有历史意义的推荐系统竞赛所用的数据集)。 下载地址为:http://files.grouplens.org/datasets/movielens/,有好几种版本,对应不同数据量,本文所用的数据为1M的数据。 2、数据介绍 1m的数据解压后,可以看到四个主要的csv文件,
石晓文
2018/04/11
2.6K1
推荐系统实战-基于用户的协同过滤
基于矩阵分解原理的推荐系统
矩阵分解是推荐系统系列中的一种算法,顾名思义,就是将矩阵分解成两个(或多个)矩阵,它们相乘后得到原始矩阵。在推荐系统中,我们通常从用户与项目之间的交互/评分矩阵开始,矩阵分解算法会将用户和项目特征矩阵分解,这也称为嵌入。下面以电影推荐中的评分,购买等矩阵为例。
老齐
2020/07/23
1.1K0
基于矩阵分解原理的推荐系统
【干货】基于协同过滤的推荐系统实战(附完整代码)
【导读】本文使用Python实现简单的推荐系统,分别实践了基于用户和基于商品的推荐系统,代码使用sklearn工具包实现。除了代码实现外,还分别从理论上介绍了两种推荐系统原理:User-Based Collaborative Filtering 和 Item-Based Collaborative Filtering,并讲解了几种常见的相似性度量方法及它们分别适用场景,还实现了推荐系统的评估。最终分析两种推荐系统的优劣,说明混合推荐技术可能具有更好的性能。 作者 | Chhavi Saluja 编译 | 专
WZEARW
2018/04/13
14.5K0
【干货】基于协同过滤的推荐系统实战(附完整代码)
推荐系统的PMF - 概率矩阵分解和协同过滤
自动化推荐系统通常用于根据现有的偏好数据为用户提供他们感兴趣的产品建议。文献中通常描述了不同类型的推荐系统。我们这篇文章将突出介绍两个主要类别,然后在第二个类别上进一步扩展:
deephub
2020/06/11
8260
第十七章 推荐系统
第一、仅仅因为它是机器学习中的一个重要的应用。在过去几年,我偶尔访问硅谷不同的技术公司,我常和工作在这儿致力于机器学习应用的人们聊天,我常问他们,最重要的机器学习的应用是什么,或者,你最想改进的机器学习应用有哪些。我最常听到的答案是推荐系统。现在,在硅谷有很多团体试图建立很好的推荐系统。因此,如果你考虑网站像亚马逊,或网飞公司或易趣,或iTunes Genius,有很多的网站或系统试图推荐新产品给用户。如,亚马逊推荐新书给你,网飞公司试图推荐新电影给你,等等。这些推荐系统,根据浏览你过去买过什么书,或过去评价过什么电影来判断。这些系统会带来很大一部分收入,比如像亚马逊和网飞这样的公司。因此,对推荐系统性能的改善,将对这些企业的有实质性和直接的影响。
tomas家的小拨浪鼓
2019/03/19
6180
第十七章 推荐系统
一文帮你梳理清楚:奇异值分解和矩阵分解 | 技术头条
【导读】在推荐系统的相关研究中,我们常常用到两个相关概念:矩阵分解和奇异值分解。这两个概念是同一种算法吗?两者到底有什么差别?在本文中,作者梳理了两种算法的概念、来源和内容,并进行了比较。通过对相关内容的梳理,作者提出,矩阵分解是推荐系统中最初使用的概念,奇异值分解是对该方法的进一步发展。在现在的讨论中,一般将两种方法统一成为奇异值分解。
AI科技大本营
2019/05/14
8270
一文帮你梳理清楚:奇异值分解和矩阵分解 | 技术头条
【推荐系统】推荐系统概述
许多人把推荐系统视为一种神秘的存在,他们觉得推荐系统似乎知道我们的想法是什么。Netflix 向我们推荐电影,还有亚马逊向我们推荐该买什么样的商品。推荐系统从早期发展到现在,已经得到了很大的改进和完善,以不断地提高用户体验。尽管推荐系统中许多都是非常复杂的系统,但其背后的基本思想依然十分简单。
黄博的机器学习圈子
2021/07/07
2K0
【推荐系统】推荐系统概述
推荐系统之矩阵分解模型
最近在整理Embedding技术在推荐系统中的应用,总结了获取各类item2vec的方法,推荐系统中的矩阵分解作为解决item2vec问题初期技术方法之一,虽已在推荐领域摸爬滚打了十几年,但至今仍旧在工业界的推荐场景中扮演着重要的角色,本文就对推荐系统中的矩阵分解进行简单的介绍,为后续几篇介绍推荐系统中的Embedding技术做铺垫。
流川枫
2020/04/24
1.5K0
[吴恩达机器学习笔记]16推荐系统5-6协同过滤算法/低秩矩阵分解/均值归一化
对推荐的结果进行预测,得到一个预测值的矩阵,这个矩阵的预测结果和用户评分数据矩阵 Y 中数据一一对应:
演化计算与人工智能
2020/08/14
9850
[吴恩达机器学习笔记]16推荐系统5-6协同过滤算法/低秩矩阵分解/均值归一化
独家 | 从零开始用python搭建推荐引擎(附代码)
当今社会的每个人都面临着各种各样的选择。例如,如果我漫无目的想找一本书读,那么关于我如何搜索就会出现很多可能。这样一来,我可能会浪费很多时间在网上浏览,并且在各种各样的网站上搜寻,希望能找到有价值的书籍。这个时候我可能寻找别人的推荐。
数据派THU
2018/12/05
1.9K0
【机器学习】从电影数据集到推荐系统
你们可能曾经花上几分钟甚至几个小时去选择一部电影单独看或者和家人一起看,不幸的是没有成功?你希望有人在这种时候替你做决定,这正是推荐系统的作用。
黄博的机器学习圈子
2021/07/07
3.3K1
【机器学习】从电影数据集到推荐系统
推荐系统之矩阵分解(MF)及其python实现
        目前推荐系统中用的最多的就是矩阵分解方法,在Netflix Prize推荐系统大赛中取得突出效果。以用户-项目评分矩阵为例,矩阵分解就是预测出评分矩阵中的缺失值,然后根据预测值以某种方式向用户推荐。今天以“用户-项目评分矩阵R(M×N)”说明矩阵分解方式的原理以及python实现。
Flaneur
2020/03/25
2.6K0
推荐系统基础:使用PyTorch进行矩阵分解进行动漫的推荐
我们一天会遇到很多次推荐——当我们决定在Netflix/Youtube上看什么,购物网站上的商品推荐,Spotify上的歌曲推荐,Instagram上的朋友推荐,LinkedIn上的工作推荐……列表还在继续!推荐系统的目的是预测用户对某一商品的“评价”或“偏好”。这些评级用于确定用户可能喜欢什么,并提出明智的建议。
deephub
2020/09/07
1.6K0
推荐系统基础:使用PyTorch进行矩阵分解进行动漫的推荐
开发|如何用深度学习推荐电影?手把手教你
简介 几乎所有人都喜欢与家人、朋友一起观看电影度过闲暇时光。大家可能都有过这样的体验:本想在接下来的两个小时里看一个电影,却坐在沙发上坐了20分钟不知道看什么,选择困难症又犯了,结果好心情也变得沮丧。所以,我们很需要一个电脑代理,在做挑选电影的时候提供推荐。 现在,电影智能推荐系统已经成为日常生活中的一部分。 Data Science Central 曾表示: “虽然硬数据很难获得,但知情人士估计,对亚马逊和Netflix这样的大型电商平台,推荐系统为它们带来高达10%至25%的收入增长”。 在这个项
AI科技评论
2018/03/13
1K0
开发|如何用深度学习推荐电影?手把手教你
如何使用矩阵分解提升推荐效果
推荐系统在现代互联网应用中扮演着至关重要的角色,无论是电商平台的商品推荐,还是流媒体平台的视频推荐,都离不开高效的推荐算法。矩阵分解技术,作为推荐系统中的一种经典方法,因其优越的性能而被广泛应用。矩阵分解技术的核心思想是将用户-物品交互矩阵分解为低维矩阵,以此来挖掘用户和物品的潜在特征,从而提升推荐效果。
数字扫地僧
2024/08/08
1690
协同过滤算法概述与python 实现协同过滤算法基于内容(usr-item,item-item)
协调过滤推荐概述   协同过滤(Collaborative Filtering)作为推荐算法中最经典的类型,包括在线的协同和离线的过滤两部分。所谓在线协同,就是通过在线数据找到用户可能喜欢的物品,而离线过滤,则是过滤掉一些不值得推荐的数据,比比如推荐值评分低的数据,或者虽然推荐值高但是用户已经购买的数据。   协同过滤的模型一般为m个物品,m个用户的数据,只有部分用户和部分数据之间是有评分数据的,其它部分评分是空白,此时我们要用已有的部分稀疏数据来预测那些空白的物品和数据之间的评分关系,找到最
学到老
2018/04/18
7.7K0
协同过滤算法概述与python 实现协同过滤算法基于内容(usr-item,item-item)
矩阵分解在协同过滤推荐算法中的应用
    在协同过滤推荐算法总结中,我们讲到了用矩阵分解做协同过滤是广泛使用的方法,这里就对矩阵分解在协同过滤推荐算法中的应用做一个总结。(过年前最后一篇!祝大家新年快乐!明年的目标是写120篇机器学习,深度学习和NLP相关的文章)
刘建平Pinard
2018/08/14
1.2K0
在Python中实现你自己的推荐系统
现今,推荐系统被用来个性化你在网上的体验,告诉你买什么,去哪里吃,甚至是你应该和谁做朋友。人们口味各异,但通常有迹可循。人们倾向于喜欢那些与他们所喜欢的东西类似的东西,并且他们倾向于与那些亲近的人有相似的口味。推荐系统试图捕捉这些模式,以助于预测你还会喜欢什么东西。电子商务、社交媒体、视频和在线新闻平台已经积极的部署了它们自己的推荐系统,以帮助它们的客户更有效的选择产品,从而实现双赢。 两种最普遍的推荐系统的类型是基于内容和协同过滤(CF)。协同过滤基于用户对产品的态度产生推荐,也就是说,它使用“人群的智慧
CDA数据分析师
2018/02/05
3K0
在Python中实现你自己的推荐系统
实战基于矩阵分解的推荐系统
设: U 为所有用户集合 P 为所有物品集合 R 为用户对物品的喜好程度 模型 Model(R) = U * P 算法核心: 通过用户对不同物品的打分,来预测用户对其他物品的喜好程度。此处并没有考虑用户和物品的属性,如:用户年龄,性别,学历,工作等,物品价格,品类,外观等。
周萝卜
2019/08/01
9300
实战基于矩阵分解的推荐系统
推荐阅读
相关推荐
初学者指南:利用SVD创建推荐系统
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档