06 人以群分 基于邻域的协同过滤算法

这一讲我们将正式进入算法内容的学习。

推荐算法本质

推荐算法本质上是一一种信息处理方法,它将用户信息和物品信息处理后,最终输出了推荐结果。因为 05 讲中基于热门推荐、基于内容推荐、基于关联规则推荐等方法比较粗放,所以推荐结果往往不够精准。如果我们想打造一个千人千面、真正符合用户个性化推荐需求的推荐系统,就需要使用到更为复杂的运算逻辑——推荐算法。

而推荐算法又分为传统机器学习算法和深度学习算法,因此我们会分别通过模块二、三两大模块单独进行介绍,模块二我们主要学习传统机器学习算法。

根据是否使用了辅助信息(如商品的类名、店铺名等),传统机器学习算法分为了基于邻域的方法和基于特征的方法这两类。06 讲我们主要介绍基于邻域的推荐算法——协同过滤算法,基于特征的方法将在 07 中着重介绍。

我们把用户编号作为纵坐标,帖子编号作为横坐标,并通过将用户与帖子是否存在交互过程进行标记,然后填写到如下所示表格中。这时,一个用户与物品的行为矩阵就这样搭建成功了。

 

请注意:表中的帖子数量和用户数量十分庞大。

针对上表中的内容,如果我们对行为分类进行打分(比如点击浏览 1 分、打电话 3 分、58 微聊 3 分、收藏 5分等),再把对应分数填充到矩阵中,就可以得到一个评分矩阵,具体细节这里不作描述。

此时,如果我们需要对用户 A 进行推荐,根据如下所示表格,我们发现用户 A、用户 B 与用户 C 都对帖子 1、帖子 2、帖子 3 感兴趣,因此我们认为用户 A、用户 B、用户 C 比较相似。

同时,我们还发现用户 B 还看过帖子 4,用户 C 还看过帖子 5,而这 2 个帖子用户 A 都没看过。基于相似性原则,我们认为用户 A 很大概率上会对帖子 4 和帖子 5 感兴趣。因此,生成推荐时,我们也会向用户 A 推荐帖子 4 和帖子 5。

以上就是协同过滤算法的基本思想,接下来我们将协同过滤算法逐个拆解进行说明。

协同过滤算法分类

在互联网应用场景中,存在大量用户看了又看、买了又买、买过还买等情况,因此,我们需要利用集体智慧将用户和物品的所有交互行为实现个性化推荐,此时就可以考虑使用协同过滤算法。

协同过滤算法(Collaborative Filtering,简称 CF)是推荐算法中最成熟、应用最广的一种算法。根据模型相似度计算的对象,我们把协同过滤算法(CF)分为了 UserCF、ItemCF 、ModelCF 这 3 种,下面我们逐一展开说明。

基于用户的协同过滤算法(UserCF)

通过分析用户喜欢的物品,我们发现如果两个用户(用户A 和用户 B)喜欢过的物品差不多,则这两个用户相似。此时,我们可以将用户 A 喜欢过但是用户 B 没有看过的物品推荐给用户 B。

基于用户的协同过滤算法(UserCF)的具体实现思路如下:

(1)计算用户之间的相似度;

(2)根据用户的相似度,找到这个集合中用户未见过但是喜欢的物品(即目标用户兴趣相似的用户有过的行为)进行推荐。

基于物品的协同过滤算法(ItemCF)

通过分析用户喜欢的物品,我们发现如果两个物品被一拨人喜欢,则这两个物品相似。此时,我们就会将用户喜欢相似物品中某个大概率物品推荐给这群用户。

基于物品的协同过滤算法的具体实现思路如下:

(1)计算物品之间的相似度;

(2)根据物品的相似度和用户的历史行为进行推荐。

基于模型的协同过滤算法(ModelCF)

基于模型的协同过滤算法也叫基于学习的方法,通过定义一个参数模型,我们可以描述用户和物品、用户和用户、物品和物品之间的关系,然后将已有的用户与物品评分矩阵(例如矩阵分解、隐语义模型 LFM 等)作为样本优化求解,最终得到模型参数。

关于这个算法的具体实现思路我们会在下面的内容中进行着重说明。

了解了协同过滤算法的具体实现思路,下面我们来看看具体的计算过程,这也是本节课的重点内容,一定要好好学哦~

协同过滤算法计算过程

协同过滤算法(CF) 的本质是矩阵填充问题(Matrix Completion),即基于矩阵内部的已知值填充剩下的未知值。已知值指用户对已经交互过的物品的打分,未知值指用户对未交互过的物品的打分,对未知值的填充也就是指整个模型预测过程。

协同过滤算法(CF)的计算基础是相似度计算,因此,协同过滤算法(CF)计算过程的第一步就是找到与目标用户相似的用户或者与目标物品相似的物品,例如 UserCF 依赖计算用户之间的相似度,ItemCF 依赖计算物品之间的相似度等。

一般来说,常见的相似度计算方法主要分为基于欧式距离的相似度计算、基于 Jaccard 公式的相似度计算、余弦相似度计算、皮尔逊相似度计算等。这里,我们将重点说一下使用最多的 Jaccard 相似度计算、余弦相似度计算和皮尔逊相似度计算。

Jaccard相似度计算

关于 Jaccard 相似度的计算公式如下图所示:

其中 N(u) 表示用户 u 购买物品的数量,N(v) 表示用户 v 购买物品的数量,N(u)⋂N(v) 表示用户 u 和 v 购买相同物品的数量。

余弦相似度计算

关于余弦相似度的计算公式如下图所示:

其中,数学公式: R{ik} 表示用户 i 对物品 k 的打分,数学公式: R{jk} 表示用户 j 对物品 k 的打分,n 为总物品数量。

皮尔逊相似度计算

数学公式: I{ij} 表示用户 i 和用户 j 的打分物品集合,R{i,c} R{j,c} 分别表示用户 i 对物品 c 的打分数、用户 j 对物品 c 的打分数,image.png分别表示用户 i 所有评分的平均数、用户 j 所有评分的平均数。

由此可见,Jaccard 相似度计算和余弦相似度计算结果为绝对距离,而皮尔逊相似度计算结果是相对距离。Jaccard 相似度计算和余弦相似度计算通过将各个用户在评分上的差异性去均值,从而避免了分数膨胀问题的发生,关于相似度算法的细节在 06 讲中我们不作深入讨论。

相似度计算结果输出后,下一步我们需要做的事情是对未知值进行预测。

对 UserCF 来说,假设存在用户 u 和用户 v,由第一步已知用户 u 与用户 v 的相似度是w{uv} ,其中用户 v 对物品 i 有过交互行为,打分为 r{vi} ,用户 u 对物品 i 没有交互行为,即没有打分。于是,通过利用与用户 u 最相似的 k 个用户 S(u,k)对物品 i 的打分,我们就可以得到用户 u 对未交互的物品 i 的预测分数,具体的计算公式如下图所示:

其中 N(i) 是所有对物品 i 有过交互行为和打分的用户集合, w{uv} 代表用户 u 和用户 v 的相似度,r{vi}代表用户 v 对物品 i 进行直接交互的行为打分。

对 ItemrCF 来说,假设存在物品 i 和物品 j,由第一步已知物品 i 和物品 j 的相似度为w{ji} ,其中用户 u 对物品 i 有过交互行为,打分为 r{ui},用户 u 对物品 j 没有交互行为和打分。于是,利用用户 u 对物品 i 最相似的 k 个物品的打分 S(j,k),我们就可以得到用户 u 对未交互的物品 j 的预测分数,具体的计算公式如下图所示:

其中 N(u)代表用户喜欢的物品的集合,w{ji}代表物品 j 和物品 i 的相似度, r{ui}是用户 u 对物品 i 进行直接交互的行为打分。

以上我们介绍了 UserCF 和 ItemCF 算法的计算过程,二者都是基于用户和物品的交互行为进行计算。其中,UserCF 计算用户间的相似度,ItemCF 计算物品间的相似度,然后我们利用相似度计算结果给用户推荐行为历史记录相似度较高的物品。

当然,除了以上两种计算算法外,推荐系统还可以依照用户兴趣分类给用户推荐该类别的物品,也就是我们前面所说的基于模型的协同过滤算法(ModelCF)。

关于基于模型的协同过滤算法(ModelCF)的具体实现思路如下:

(1)根据用户行为得到用户在各个分类的兴趣打分;

(2)将不用的物品分别放入各个分类下。

这里需要说明的是,同一个物品可以分别属于不同的分类,比如对《道德经》这本书进行分类,它既可以归为“哲学”,也可以归为“古典文学”,至于它更偏向于哪个分类,我们以其在这两个分类上对应的权重系数进行判断,即完全取决于用户把《道德经》当成哲学著作来读还是当作文学作品来读,这就是用户行为的具象化。对用户行为进行分类后,我们就能够计算出该用户在每个分类上的偏好权重。

基于模型的协同过滤算法(ModelCF)通过基于用户行为统计的自动聚类,指定了表征用户偏好和物品的向量维度,最终得到用户的偏好向量和物品的表征向量,最终利用表征向量实现对应物品推荐,具体实现步骤为:

(1)计算物品的分类、用户和物品的表征向量;

(2)根据用户和物品的表征向量进行推荐。

这里可以看出,我们需要解决的核心问题是计算用户和物品的表征向量(是不是出现深度学习的影子了?)。而隐语义模型(LFM)正是基于这样的思路,因此它完美解决了这个核心问题。下面我们具体讲解下隐语义模型的实现思路。

假设物品有若干个分类,不同用户对不同分类的兴趣度不同,同时每个分类中又包含若干种物品,每个物品在该分类中又会存在一个对应权重。因此,任何一个用户 u 对物品 i 的偏好计算(用户和物品的表征向量),我们可以使用如下图所示的计算公式:

其中, p{u,k}表示用户 u 和分类 f 的偏好权重, q{i,k} 表示物品 i 和分类 f 的权重。

从公式中,我们发现 LFM 把用户评分矩阵分解为了用户偏好矩阵和物品分类矩阵,这就是所谓的矩阵分解方法。其实,LFM 属于矩阵分解方法中最基础的一种方法,之后逐步衍生出了 FunkSVD、BiasSVD、 SVD++ 等广泛应用的方法。

小结与预告

协同过滤算法曾经是推荐算法中经典的存在,曾几何时只要我们提到推荐系统,就会提起协同过滤算法。因此,06 讲我们主要介绍了典型的推荐算法——协同过滤算法,它本质上是一个矩阵填充问题,通过相似度计算即可完美解决(包括基于用户的相似、基于物品的相似等)。另外,我们还可以通过矩阵分解方法找到用户和物品在某个维度上的表征向量。

《道德经》中说:“和其光,同其尘,是谓玄同”,协同过滤算法真正做到了“从用户中来到用户中去”,它通过摆脱硬性规则,从而在效果上超越了其他策略。07 讲我将带你深入了解传统机器学习算法的另外一种方法——推荐特征交叉算法。

对于协同过滤算法,你是否还有不同的见解?欢迎在留言区与我进行互动、交流。

另外,如果你觉得本专栏有价值,欢迎分享给更多好友哦~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言 | Leetcode C语言题解之第231题2的幂

题目&#xff1a; 题解&#xff1a; const int BIG 1 << 30;bool isPowerOfTwo(int n) {return n > 0 && BIG % n 0; }

Study--Oracle-07-ASM自动存储管理(二)

一、ASM安装准备条件 1、ASM支持存储类型 本地祼设备&#xff08;本地的磁盘和分区&#xff09; 网络附加存储(NAS) 存储区域网络(SAN) 2、ASM使用本地裸设备&#xff0c;要点: 已经被挂载到操作系统上或者已经做了分区 映射裸设备为文件名 设置正确的权限&#xff08;针对g…

C++继承和多态

目录 继承 继承的意义 访问限定符、继承方式 赋值兼容规则&#xff08;切片&#xff09; 子类的默认成员函数 多继承 继承is a和组合has a 多态 什么是多态 形成多态的条件 函数重载&#xff0c;隐藏&#xff0c;重写的区别 override和final 多态原理 继承 继承的…

矩阵管理系统实现后台统一管理的解决方案

在当今数字化浪潮中&#xff0c;企业面临着前所未有的挑战与机遇。如何快速响应市场变化、提升运营效率、降低管理成本&#xff0c;成为众多企业关注的焦点。而矩阵管理系统作为一种新兴的管理工具&#xff0c;凭借其强大的后台统一管理能力&#xff0c;正成为越来越多企业的首…

【Redis】复制(Replica)

文章目录 一、复制是什么&#xff1f;二、 基本命令三、 配置&#xff08;分为配置文件和命令配置&#xff09;3.1 配置文件3.2 命令配置3.3 嵌套连接3.4 关闭从属关系 四、 复制原理五、 缺点 以下是本篇文章正文内容 一、复制是什么&#xff1f; 主从复制 master&#xff…

基于javaScript的冒泡排序

目录 一.前言 二.设计思路和原理 三.源代码展示 四. 案例运行结果 一.前言 冒泡排序简而言之&#xff0c;就是一种算法&#xff0c;能够把一系列的数据按照一定的顺序进行排列显示&#xff08;从小到大或从大到小&#xff09;。例如能够将数组[5,4,3,2,1]中的元素按照从小到…

使用数字孪生实现电池管理系统 (BMS) 测试自动化

电池管理系统 (BMS) 监控和控制电动飞机和电动汽车等车辆中的电池。它需要在正常和极端条件下进行严格测试&#xff0c;以证明其质量和完整性。 使用模拟电池进行测试非常有益&#xff0c;因为可以快速、反复地安全地测试各种条件&#xff0c;而不会冒着宝贵硬件的风险。这种硬…

Hash表(C++)

本篇将会开始介绍有关于 unordered_map 和 unordered_set 的底层原理&#xff0c;其中底层实现其实就是我们的 Hash 表&#xff0c;本篇将会讲解两种 Hash 表&#xff0c;其中一种为开放定址法&#xff0c;另一种为 hash 桶&#xff0c;在unordered_map 和 unordered_set 的底层…

6、evil box one

低—>中 目标&#xff1a;获取root权限以及2个flag 主机发现 靶机 192.168.1100.40 或者使用fping -gaq 192.168.100.1/24发现主机使用ping的方式。 端口扫描 发现开放了22和80 可以使用-A参数&#xff0c;-A参数会得到更多的扫描细节 访问80端口就是一个apache的基本的…

Redis 7.x 系列【23】哨兵模式

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 工作原理2.1 监控2.2 标记下线2.3 哨兵领袖2.4 新的主节点2.5 通知更新 3. …

JMeter案例分享:通过数据验证的错误,说说CSV数据文件设置中的线程共享模式

前言 用过JMeter参数化的小伙伴&#xff0c;想必对CSV Data Set Config非常熟悉。大家平时更关注变量名称&#xff0c;是否忽略首行等参数&#xff0c;其余的一般都使用默认值。然而我最近遇到一个未按照我的预想读取数据的案例&#xff0c;原因就出在最后一个参数“线程共享模…

服务重启时容器未自动启动

1、容器重启策略 通过设置容器的重启策略&#xff0c;‌可以决定在容器退出时Docker守护进程是否重启该容器。‌常见的重启策略包括&#xff1a;‌ no&#xff1a;‌不重启容器&#xff0c;‌默认策略。‌always&#xff1a;‌无论容器是如何退出的&#xff0c;‌总是重启容器…

keil配置irom偏移地址进行IAP,偏移地址不生效问题解决

如果keil配置了 IROM1 偏移地址&#xff0c;但是生成的hex&#xff0c;程序并没有偏移&#xff0c;问题多半是出现在linker里如下图所示。选择了分散加载&#xff0c;所以keil配置地址偏移不生效。 点开edit 更改分散加载的地址偏移即可。 偏移成功&#xff0c;可以IAP了。

算法学习笔记(8.5)-零钱兑换问题二

目录 Question&#xff1a; 动态规划思路&#xff1a; 代码实现&#xff1a; 空间优化代码 Question&#xff1a; 给定n种硬币&#xff0c;第i种硬币的面值为coins[i-1],目标金额为amt&#xff0c;每种硬币可以重复选取&#xff0c;问凑出目标金额的硬币组合数量。 动态规划思路…

Java 线程池详解

序言 在高并发编程中&#xff0c;线程池是一个非常重要的组件。它不仅能够有效地管理和复用线程资源&#xff0c;还可以提升应用程序的性能和稳定性。本文将详细介绍Java中的线程池机制&#xff0c;以及如何正确地使用线程池。 一、什么是线程池 线程池是一组已经初始化并等…

ftp pool 功能分析及 golang 实现

本文探究一种轻量级的 pool 实现 ftp 连接。 一、背景 简要介绍&#xff1a;业务中一般使用较多的是各种开源组件&#xff0c;设计有点重&#xff0c;因此本文探究一种轻量级的 pool 池的思想实现。 期望&#xff1a;设置连接池最大连接数为 N 时&#xff0c;批量执行 M 个 F…

超时导致SparkContext构造失败的问题探究

文章目录 1.前言2. 基于事故现场对问题进行分析2.1 日志分析2.2 单独测试Topology代码试图重现问题 3. 源码解析3.1 Client模式和Cluster模式下客户端的提交和启动过程客户端提交时在两种模式下的处理逻辑ApplicationMaster启动时在两种模式下的处理逻辑 3.2 两种模式下的下层角…

OSPF.综合实验

1、首先将各个网段基于172.16.0.0 16 进行划分 1.1、划分为4个大区域 172.16.0.0 18 172.16.64.0 18 172.16.128.0 18 172.16.192.0 18 四个网段 划分R4 划分area2 划分area3 划分area1 2、进行IP配置 如图使用配置指令进行配置 ip address x.x.x.x /x 并且将缺省路由…

uniapp编译成h5后接口请求参数变成[object object]

问题&#xff1a;uniapp编译成h5后接口请求参数变成[object object] 但是运行在开发者工具上没有一点问题 排查&#xff1a; 1&#xff1a;请求参数&#xff1a;看是否是在请求前就已经变成了[object object]了 结果&#xff1a; 一切正常 2&#xff1a;请求头&#xff1a;看…

2024辽宁省数学建模C题【改性生物碳对水中洛克沙胂和砷离子的吸附】原创论文分享

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了2024 年辽宁省大学数学建模竞赛C题改性生物碳对水中洛克沙胂和砷离子的吸附完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃…