首页 > 编程语言 >基于用户的协同推荐算法

基于用户的协同推荐算法

时间:2023-02-20 17:23:49浏览次数:135  
标签:协同 推荐 用户 算法 相似 物品 感兴趣

基于用户的协同推荐算法。这个算法是最早诞生的推荐算法的一种。下面就简单介绍一下它的思想和原理。

一、基本思想

大家在日常使用的一些App中,相信也或多或少地遇到过基于用户的协同推荐算法。比如我经常浏览的B站,我们关注过一些UP主之后,系统就会有额外的推荐供选择。

在这里插入图片描述

当然,这其中的算法会更为复杂,它可能会根据日常使用App的行为习惯,系统将用户归为某一领域的爱好者,当你关注某一UP主之后,系统就能提供其他你可能也敢兴趣UP。而基于用户的协同推荐算法简单点来理解就是当一个用户需要个性化推荐时(当然推荐可以是电影、音乐、UP主等等),可以先找到和这个用户兴趣相似的用户群体,然后把 这个用户群体中关注的、并且用户没有听说过的推荐给该用户。

二、算法原理

基于用户的协同过滤推荐算法,我们可以将算法拆分成两个步骤,第一个就是要找到与目标用户兴趣相似的用户集合,另外一个步骤就是找到这个集合中用户喜欢的、并且目标用户没有听说过的物品推荐给目标用户。

(1).找到兴趣相似的用户集合

要找到兴趣相似的用户群体,首先我们得先定义指标来度量用户与用户之间的相似度。这也好像我们之间提及到的K近邻算法,又或者聚类算法的影子。我们此处引入Jaccard 公式和余弦相似度,用两者计算用户之间的相似度。假设N(a)表示用户a感兴趣的物品集合,N(b)则是用户b的感兴趣物品集合,那么用Jaccard公式计算 用户之间的相似度如下:


而另外一种计算方法余弦相似度则可表示为:

 

下面用一个简单的例子说明如何计算用户之间的相似度,假设有5个用户A-E,共有6样物品a-f,具体用户喜欢的物品明细如下:


第一步我们需要先将上面的数据进转换,转换成物品-用户的形式:


然后对于每个物品,喜欢他的用户,两两之间相同物品加1。例如喜欢物品 d 的用户有 A 和 B,那么在矩阵对应的位置标记为1。下图为完整的得分:

 

到这一步还需要构造分母,Jaccard 公式和余弦相似度的分母是不一样的。比如前者,对于A和B,分母就是A和B喜欢物品的并集,记为{a,b,c,d},数值就是4。而后者就是根号6(3×2)。那么我们就以前者为标准,完成完整的相似度表格:

 

到此,计算用户相似度就大功告成,可以很直观的找到与目标用户兴趣较相似的用户。

(2).推荐物品

我们推荐物品的过程是参考上面相似度表格,找到与目标用户s相似度较高的k个用户,标志为用户群体T(s,k),并且将T中的所有物品提取出来,且去掉目标用户已喜欢的物品。然后对于每个候选物品i,定义目标用户对候选物品感兴趣程度用以下公式计算:


其中r_vi表示用户群体T中的用户v对物品i的喜欢程度,我们在上面的过程中默认为1。有时候可能需要用户给予对应的评分数据,才能较准确地描述喜欢程度。继续用上面的例子,假设我们的目标用户为A,我们在与A相似的用户群体{B,C,D}中,物品c、e和f是A没有感兴趣,但是用户群体中包含的,分别计算P(A,c)、P(A,e)和P(A,f):


从计算结果可以看出,如果对用户A推荐其可能感兴趣的物品,物品e能成为A的兴趣对象可能较高。上面通过一步步地介绍用户相似度的计算,用户对物品感兴趣的定义,以及用户对于其他未接触的物品感兴趣程度的估计,相信大家都这个基于用户的协同过滤算法有了最基础的认识。当然在我们现实生活中的应用,并不是这样简单,算法会变得更加复杂,且优化后的推荐效果更是上升了很多。

标签:协同,推荐,用户,算法,相似,物品,感兴趣
From: https://www.cnblogs.com/KaiStudy/p/17138203.html

相关文章

  • golang中的GPM(用户态的线程池)
     全局队列(GlobalQueue):存放等待运行的G。P的本地队列:同全局队列类似,存放的也是等待运行的G,存的数量有限,不超过256个。新建G’时,G’优先加入到P的本地队列,如果......
  • 万字长文浅析Java集合中的排序算法
    作者:京东物流秦彪1. 引言排序是一个Java开发者,在日常开发过程中随处可见的开发内容,Java中有丰富的API可以调用使用。在Java语言中,作为集合工具类的排序方法,必定要做到通......
  • python 获取b站 个人关注列表用户信息
    前言本程序是get_bili_medal_list项目的一个子程序,用于获取个人关注列表用户信息。整体很简单,没啥东西,主要是辅助作用。数据获取完毕后,存储于data/follows.json(提前......
  • hihoCoder 1098 : 最小生成树二·Kruscal算法
    #1098:最小生成树二·Kruscal算法10000ms1000ms256MB描述随着小Hi拥有城市数目的增加,在之间所使用的Prim算法已经无法继续使用了——但是幸运的是,经过计算机的......
  • hihoCoder 1097 : 最小生成树一·Prim算法
    #1097:最小生成树一·Prim算法10000ms1000ms256MB描述最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以拥有不止一个城市了!但是,问题也接踵......
  • hihoCoder 1089 : 最短路径·二:Floyd算法
    #1089:最短路径·二:Floyd算法10000ms1000ms256MB描述万圣节的中午,小Hi和小Ho在吃过中饭之后,来到了一个新的鬼屋!鬼屋中一共有N个地点,分别编号为1..N,这N个地点之......
  • 算法之字符串
    字符串字符串--反转字符串题目:力扣题目链接(opensnewwindow)编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组char[]的形式给出。不要给另外的......
  • vsftpd虚用户配置
    新建账号:saimeike、zhangsanvim/etc/vsftpd/vuser.list编辑文件内容如下:(账号的密码为下一行字符,不可有空行)saimeike000zhangsan000db_load-T-thash-f/etc/......
  • 算法刷题 Day 44 | ● 完全背包 ● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ
    力扣上没有纯粹的完全背包的题目,所以大家看本篇了解一下完全背包的理论后面的两道题目,都是完全背包的应用,做做感受一下完全背包视频讲解:https://www.bilibili.c......
  • 算法基础模板
    时空复杂度分析一般ACM或者笔试题的时间限制是1秒或2秒。在这种情况下,C++代码中的操作次数控制在107~108为最佳。下面给出在不同数据范围下,代码的时间复杂度和算法该如何选......