一文看懂推荐系统:召回01:基于物品的协同过滤(ItemCF),item-based Collaboration Filter的核心思想与推荐过程

一文看懂推荐系统:召回01:基于物品的协同过滤(ItemCF),item-based Collaboration Filter的核心思想与推荐过程

提示:最近系统性地学习推荐系统的课程。我们以小红书的场景为例,讲工业界的推荐系统。
我只讲工业界实际有用的技术。说实话,工业界的技术远远领先学术界,在公开渠道看到的书、论文跟工业界的实践有很大的gap,
看书学不到推荐系统的关键技术。
看书学不到推荐系统的关键技术。
看书学不到推荐系统的关键技术。

王树森娓娓道来**《小红书的推荐系统》**
GitHub资料连接:http://wangshusen.github.io/
B站视频合集:https://space.bilibili.com/1369507485/channel/seriesdetail?sid=2249610


提示:文章目录


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

从本文开始,我们学习推荐系统链路上的召回环节。

今儿个是基于物品的系统过滤,缩写是item cf
item意思是物品,就是你平时看的电影,买的商品,听得音乐,定的外卖啥的等等物品。
CF是collaboration filter的缩写,意思是协同过滤。

首先有个通俗的例子解释item cf的原理,
在这里插入图片描述

比方说我喜欢看《笑傲江湖》,笑傲江湖与《鹿鼎记》相似,而且我没有看过《鹿鼎记》,那么系统会给我推荐《鹿鼎记》,
推荐的理由是两个物品很相似系统,通过历史记录可以知道我喜欢看笑傲江湖。而且我没有看过鹿鼎记。

但是推荐系统如何知道笑傲江湖与鹿鼎记相似?

有很多种办法可以做到,比如用知识图谱了解到两本书的作者相同,所以两本书相似,
还可以基于群体用户的行为判断两个物品的相似性。
在这里插入图片描述

比如看过笑傲江湖的用户,也看过鹿鼎记,给笑傲江湖写好评的用户,也给鹿鼎记写好评。
我们可以从用户的行为中挖掘出物品之间的相似性,再利用物品之间的相似性做推荐。

item cf具体怎么做?

每个用户都交互过若干物品,比如点击、点赞、收藏、转发过的物品;
可以量化用户对物品的兴趣,比如点击、点赞、收藏、转发的四种行为各算一分(打分–评价分数:rate)。
在这里插入图片描述

在这个例子中,用户对此物品的兴趣分数分别是2143,
然后,来了一个用户没有交互过的候选物品,我们要决定是否把这个物品推荐给用户。
在这里插入图片描述

假设我们知道物品两两之间的相似度,比如item和前面那几个物品之间的相似度分别是0.1,0.4,0.2,0.6。
【这个数字咋来的呢?】后面会详细讲解相似度是如何计算出来的,
在这里插入图片描述

我们先用下面的公式来预估用户对候选物品的兴趣
在这里插入图片描述

like这一项是用户对自己交互过的itemj这些物品的兴趣,也就是图中左边的四个分数,2143
sim这一项是itemj这个物品与候选物品item之间的相似度,
也就是图中右边的四个分数,0.1,0.4,0.2,0.6,
依次把两项相乘,再把所有的乘积相加得到总分得到用户对item的兴趣interest
总分表示用户对候选物品的兴趣。这个分高,就说明感兴趣,分低就不感兴趣了

在这个例子中,从用户到候选物品有四条路径,所以要计算四个分数,然后把它们相加,
计算2乘以0.1
加1乘以0.4
加4乘以0.2
加3乘以0.6。
在这里插入图片描述

这里的2143是用户对四个物品的兴趣分数,
0.1,0.4,0.2,0.6是物品之间的相似度,
四个分数相加等于3.2,表示用户对候选物品的兴趣。【1–5分评分来看,3.2其实也还可以了】

举个例子,有2000个候选物品,我们逐一计算用户对候选物品的兴趣分数。
然后返回其中分数最高的100个物品,就可以推荐展示给用户了。

上面说的sim咋计算?俩物品的相似度sim(itemi, itemj)

我们来看看具体如何计算,两个物品之间的相似度。

计算物品相似度的基本想法是这样的,两个物品的受众重合度越高,两个物品就越相似。

我们可以从数据中挖掘出物品的相似度。
举个例子,就玩射雕英雄传跟神雕侠侣的读者重合度很高,因此可以认为射雕英雄传和神雕侠侣相似。
在这里插入图片描述

我举个例子来说明什么样的两个物品被判定为不相似。

下面是一些用户,这些边表示用户喜欢物品,
在这里插入图片描述

红色和绿色这两个物品的受众没有重合,这意味着两个物品不相似。

而下面这个例子中的两个物品被判定为相似,
这是因为两个物品的受众重合度非常高,
在这里插入图片描述

我们来计算两个物品的相似度,
把喜欢物品I1的用户记作集合W1
W1是用户的集合,
把喜欢物品I2的用户记作集合W2
把集合W1和W2的交集记作V。
在这里插入图片描述
V是包含同时喜欢物品I1和I2的用户,

用sim(i1,i2)这个公式计算物品I1和 I2的相似度
公式中的分子是集合V的大小,即对两个物品都感兴趣的用户的人数
分母是集合W1 W2大小的乘积,
单取根号,这样计算出的相似度一定是一个介于零到一之间的数。
数值越大表示两个物品越相似,
为什么相似度是介于零到一之间的?
这是因为集合V比W1 W2都要小。

注意,其实这个公式没有考虑用户喜欢物品的程度,用这个公式,只要是喜欢就看做一不喜欢就看做零。

如果想要用到喜欢的程度,需要改一下这个公式,比如点击、点赞、收藏、转发各自算一分。
用户对物品的喜欢程度最多可以是四分【也就是说,用户对物品操作了四个行为,每个行为都算一个分数贡献,加起来就是总分rate】。

现在我们考虑用户喜欢物品的程度,其他都一样,
只有下面的公式变了,分子把换成用户小V对物品I1 和 I2的兴趣分数相乘。
原来是交集,现在是对那俩物品的喜欢程度
在这里插入图片描述
然后取连加,连加是关于用户小v取的,
用户小v同时喜欢两个物品,如果兴趣分数的取值是零或者一,那么分子就是同时喜欢两个物品的人数,也就是集合V的大小,
公式的分母是两个根号的乘积,第一项是用户对物品的兴趣分数。
分母是关于所有用户,求连加,然后开根号第二项类似用户对物品I的兴趣分数。

这个公式计算出的数值介于零到一之间表示两个物品的相似度,
其实这个公式就是余弦相似度cos similarity
把一个物品表示为一个向量,向量每个元素对应一个用户元素的值就是用户对物品的兴趣,
两个向量的夹角的余弦就是这个公式,我不展开讲了,大家自己思考一下为什么这个公式是余弦相似度。

在这里插入图片描述
小结一下前面的内容,item cf的基本思想是根据物品的相似度做推荐
如果某个用户喜欢物品一,而且物品一跟物品二相似,那么该用户很可能会喜欢物品二,
做推荐就需要预估用户对候选物品的兴趣有多强,
给每个物品打一个分数,
把分数高的物品推荐给用户,预估兴趣分数要用上面这个公式。

从用户的历史行为记录中,我们知道用户对物品J的兴趣,
我们还知道物品J与候选物品的相似度,
把两个数相乘,然后关于物品J去连加。

作为用户对候选物品进取分数的预估,可以这样理解,用户对物品J感兴趣,兴趣传递到候选物品,得到用户对候选物品的兴趣。
分数有很多条这样的路径,把兴趣从用户传递到物品J,再传递到候选物品,
把这些路径全都加起来,就是用户对候选物品的兴趣分数,
这个公式需要知道每两个物品之间的相似度。
在这里插入图片描述

我们事先计算物品两两之间的相似度,并且保存起来,
这样计算物品两两之间的相似度,把每个物品表示为一个系稀疏向量,向量每一个元素对应一个用户,
相似度函数就是两个向量夹角的余弦,
其实就是其学习里面常用的cos相似度。

我已经讲完了itemCF的原理,下面我要讲解itemCF用来召回的完整流程。


ItemCF召回的完整流程

为了能在线上做到实时的推荐,基本必须要事先做离线计算,建立两个索引。

一个索引是用户到物品索引,记录每个用户最近点击过交互过的物品的ID,
比如最近交互过的200个物品,有了这个索引之后,给定任意用户ID,可以快速返回他近期感兴趣的物品列表。
在这里插入图片描述

另一个索引是从物品到物品,我们首先要计算物品之间两两相似度,
这个计算量会比较大,对于每个物品,所以它最相似的K物品,比如K等于十或者100。
有了这个索引之后,给定任意物品ID,可以快速查出他对相似的配置物品的ID,而且知道相似度分数。
在这里插入图片描述

这里演示一下第一个索引,也就是用户到物品的索引,
左边usr这些是用户ID,比如小红书有几亿个用户,每个用户有一个ID,
我们记录每个用户最近点击交互的物品ID,还有它对于每个物品交互评价的一个兴趣分数rate。
在这里插入图片描述

比方说点击、点赞、收藏、转发各算一分,各种骚操作的分数相加就是用户对物品的兴趣分数,
上面第一个用户的物品列表,里面记录了物品ID和分数,分数有高有低,
下面第二个用户的物品列表,也是记录物品的ID和分数。
每个用户都有一个列表,懂?

另一个索引是从物品到物品,左边这些是物品的ID。
在这里插入图片描述

比如小红书有一篇笔记,每篇笔记就是一个物品索引,这个索引记录每个物品最相似的K个物品的ID和相似度
上面是第一个物品最相似的K物品的列表。其中的分数,0.7,0.6,0.6,0.3,0.3,表示相似度从高到低排列,
下面是第二个物品最相似的。
K物品的列表,也记录了物品ID和相似度分数。

给定任意一个物品ID,用这个索引可以快速找到它最相似的K物品。

有了索引之后,我们可以在线上给用户做实时推荐。
在这里插入图片描述

比如现在有个用户刷小红书系统,要开始做推荐,
系统知道这个用户的ID,首先查看用户到物品的索引,可以快速找到这位用户近期感兴趣的物品的列表,
我们把用户最近交互的物品叫做last n。
对于last n集合中的每个物品,我们利用物品到物品的索引,找到n个它感兴趣的物品的top k相似物品,
用户最近有N个感兴趣的物品,我们又找到了每个物品的top k相似物品,
那么一共取回N×K的物品,
对于取回的N乘以K的相似物品,用公式预估用户对这nk个物品的兴趣分数。
按照分数rate从高到低对物品做排序,
返回分数最高的100个物品,这100个物品就是ICF之后的推荐物品。

这个召回通道的输出会跟其他召回通道的输出融合起来,然后做排序,最终展示给用户。

为什么要用离线计算俩索引?

数据库中有上亿个物品,如果在线挨个按照公式计算用户对所有物品的兴趣分数,那么这个计算量会爆。

索引的意义在于避免枚举所有的物品,用空间换时间,让在线计算速度足够快

假如我们记录用户最近感兴趣的N等于200个物品,
取回每个物品最相似的K等于十个物品,
在这里插入图片描述

那么,一共也就取回N乘以K等于2000个物品,
用公式给这2000个物品打分,也就是说,分别预估用户对这2000个物品的兴趣分数,
返回分数最高的100个物品作为爱上CF这个召回通道的结果,这样计算量是很小的,可以做到在线实时计算。

总结一下,用索引的话,离线计算量大,需要更新两个索引,
好处是每次线上都召回都很快,只需要给2000个物品打分,不需要访问上亿个物品。

最后我演示一下item cf做召回的流程。
在这里插入图片描述

用户usr登录之后,系统要给这位用户做推荐,我们知道用户的ID,
利用用户到物品的索引,找到用户近期感兴趣的n个物品。
这个列表记录了物品的ID和兴趣分数。

接下来,我们要利用物品到物品的索引,找到每个物品n的top k相似物品,
我们知道这个物品的ID,我们要去索引最相似的K的物品。
这些就是top k相似物品的ID和相似度。

这个例子中,K等于2,

用同样的方法,根据物品到物品的索引,找到每个物品的top k相似物品top k相似,会召回很多物品,
然后就可以用这前面介绍过的公式计算用户对召回物品的兴趣分数,
根据算术的分数做排序,返回排在前100的物品。

做计算的时候需要用到这些列表里的数值,
用到上面列表中用户对物品的兴趣分数,
用到下面列表中物品和物品的相似度分数,

把兴趣分数跟相似度分数相乘,如果指回的物品ID有重复的,就去重。
把分数加起来,得到每个物品的兴趣分数。


最后总结一下本文的所有内容,
Item cf的原理是这样的,
在这里插入图片描述

如果某位用户喜欢物品I1,那么他可能喜欢跟物品I1相似的物品记作I2,
物品的相似度是根据交互过的用户来定的,
如果喜欢物品I1和I2的用户有很大的重叠,那么就判定物品I1与I2相似。

注意,这里不是根据物品的内容判定物品相似。
【个性化美学评价,大概率是根据物品内容(即图片场景内容)的相似程度,和属性相似度来计算的(比如美学尚需经,构图属性)】

item cf是根据用户的行为来判定物品相似。

具体是用这个公式计算物品I1与I2的相似度
分子是同时喜欢两个物品的用户的数量,分母是做归一化。

前面讲过这个公式,这里就不再具体解释了。

在工业界的推荐系统中,itemCF是最重要的召回通道之一。

为了能在线上非常快速的做召回,需要离线维护两个索引,
一个索引是从用户到物品列表,记录每个用户最近交互过的N个物品,
另一个索引是从物品到物品列表记录每个物品相似度最高的K的物品。
在这里插入图片描述

在进入召回的时候,要用到这两个索引,每次取回nk个物品,】
这个数量比较大,可能有几千个物品,不可能全都返回,还需要做个筛选。

item cf用这个公式预估用户对每个物品的兴趣分数。
这个公式用到用户对物品的兴趣分数和物品与物品的相似度,
两种分数分别记录在两个索引上,
在给待推荐的物品打分之后,返回分数最高的100个物品作为召回结果。

今天关于item cf的东西讲完了,后面几节课会讲解其他几种召回通道。

我想你应该懂了吧?
就是根据待推荐物品,和我操作过的一堆物品的相似度(加我对他们的喜欢程度),来算我可能对待推荐物品的喜好程度rate,排序rate,抽前面topN来推荐。


总结

提示:如何系统地学习推荐系统,本系列文章可以帮到你

(1)找工作投简历的话,你要将招聘单位的岗位需求和你的研究方向和工作内容对应起来,这样才能契合公司招聘需求,否则它直接把简历给你挂了
(2)你到底是要进公司做推荐系统方向?还是纯cv方向?还是NLP方向?还是语音方向?还是深度学习机器学习技术中台?还是硬件?还是前端开发?后端开发?测试开发?产品?人力?行政?这些你不可能啥都会,你需要找准一个方向,自己有积累,才能去投递,否则面试官跟你聊什么呢?
(3)今日推荐系统学习经验:itemCF就是根据待推荐物品,和我操作过的一堆物品的相似度(加我对他们的喜欢程度),来算我可能对待推荐物品的喜好程度rate,排序rate,抽前面topN来推荐。

  • 14
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的宝可梦对战功能Collaboration图: ``` title 宝可梦对战功能Collaboration图 participant 玩家 participant 对手 participant 宝可梦系统 participant 数据库 Note over 玩家,对手: 选择出战宝可梦 activate 玩家 玩家 -> 宝可梦系统: 选择要使用的招式 宝可梦系统 -> 数据库: 查询招式属性、效果等信息 数据库 -> 宝可梦系统: 返回招式属性、效果等信息 宝可梦系统 -> 对手: 显示玩家选择的招式 activate 对手 对手 -> 宝可梦系统: 选择要使用的招式 宝可梦系统 -> 数据库: 查询招式属性、效果等信息 数据库 -> 宝可梦系统: 返回招式属性、效果等信息 宝可梦系统 -> 玩家: 显示对手选择的招式 activate 宝可梦系统 宝可梦系统 -> 宝可梦系统: 根据速度值计算先后顺序 alt 先手攻击 宝可梦系统 -> 对手: 减少生命值 opt 对手宝可梦被打败 宝可梦系统 -> 数据库: 更新玩家胜利记录 数据库 -> 宝可梦系统: 返回更新结果 宝可梦系统 -> 玩家: 显示胜利信息 end else 后手攻击 宝可梦系统 -> 玩家: 减少生命值 opt 玩家宝可梦被打败 宝可梦系统 -> 数据库: 更新对手胜利记录 数据库 -> 宝可梦系统: 返回更新结果 宝可梦系统 -> 对手: 显示胜利信息 end end Note over 玩家,对手: 对战结束,显示结果信息 ``` 这个Collaboration图更加详细地描述了宝可梦对战的流程和实现方式,包括招式属性、效果的查询、先后顺序的计算、生命值的变化、胜利记录的更新等。具体的实现方式可能因开发者而异,但是这个图可以作为实现的基本框架。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰露可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值