姗姗来迟的第二篇博客,最近在了解有关推荐系统方面的基本知识和算法,先总结其中一类经典常用的算法——协同过滤法。网上已有很多介绍其原理的好文章,所以本文用较多篇幅来写一些自身对算法实现的理解和疑惑,希望有经验的小伙伴能够解惑,感激不尽!
写的比较仓促,如有描述或理解错误,敬请指出,望共同进步~
为何做推荐系统
先介绍下推荐系统中经常出现的两个术语:User 和 Item,即用户和物品,这里的物品可以是书籍、电影、新闻、视频等。
什么情况下需要推荐系统?——信息过载且用户没有明确的需求。简单理解信息过载就是Item数量非常多,用户一时半会儿不知道想要什么,这时候推荐系统就可以主动向用户提供他们可能感兴趣的物品。所以在做推荐系统前需要了解两件事儿:
(1)平台上Item的数量是否过多;如果数量不大,可以用分类目录的形式对Item进行分门别类,更方便用户找到适合自己的Item.
(2)用户每次使用平台时,自身的需求是否明确.
以抖音app为例子,里面的短视频千千万,用户一般并不清楚自己具体想看什么,推荐就成了留住用户的最好方式,所以抖音的主界面就是个推荐场景(其实还有个搜索界面);还有淘宝app和云音乐app等,里面的推荐场景随处可见。
召回和排序
回归正题,推荐系统一般包含两个算法部分:召回阶段(recall)和 排序阶段(rank)。先说排序阶段的作用,也是传统机器学习、深度学习在推荐系统中发挥威力的地方,它们可以预测用户对物品的点击率、转化率等(类似广告中CTR模型),再以特定的规则进行排序后展示给用户,更符合规则的物品做优先展示。但是不可能把所有的物品一次性喂入排序模型做预测排序(数量太多,算完用户都跑了),所以召回阶段的作用就是把所有物品做初步的筛选形成一个物品候选集,再进入排序阶段。
排序阶段里往往都是高大上的模型,似乎直接决定推荐结果,其实召回阶段产生的Item候选集也会对最终推荐结果产生很大影响。比如小明购买过一个水杯,然后召回阶段产生的候选集几乎由杯子这一类的物品组成,导致排序阶段输出的Top-N物品全是五花八门的杯子。。。显然这样的召回策略缺乏多样性,使得排序模型无论多精确都无法摆脱只推荐杯子的结局。
本文重点介绍召回阶段最常见的一类算法——协同过滤法(Collaborative Filtering),做推荐的小伙伴们都应该很熟悉吧。相比ML、DL这些模型算法,CF几乎没有什么深奥的数学原理,注重的是背后原理和思想。
协同过滤法—基于用户(UserCF)
协同过滤法属于召回阶段的算法,简单有效的特点使其仍未过时,现有的各大推荐场景中都能看到这类算法的影子。基本思想就是基于用户或物品的相似度做推荐,下面就介绍其中一种。
UserCF原理
基于用户的协同过滤法,基本思想是寻找用户A的相似用户B,把用户B接触过的物品b推荐给用户A。借鉴《推荐系统实践》一书中的说法,该算法主要包括两个步骤:
(1)找到和目标用户A兴趣相似的用户集合;
(2)找到这个集合中的用户喜欢的,且目标用户A没有发生行为的物品推荐给目标用户A。
如何衡量用户的相似度呢?首先确定计算相似度所需的用户数据来源,我第一反应就是用户的画像数据(性别、身高、收入等),但是仔细想想画像数据并不能完全反映一个用户在平台里的兴趣偏好。相比之下,用户在平台上的行为数据更能体现其在平台中的兴趣偏好,也更适用于计算用户相似度,比如抖音中的点赞、页面停留时长;淘宝中的浏览、加购、购买、评分等行为数据。
其次确定采用何种相似度指标,以下列举几个常见的相似度计算公式:
(一)对于停留时长、评分等连续型行为数据
假设用户a和用户b对所有Item的评分(停留时长)向量分别为 A 和 B,其中 A = ( a 1 , a 2 , . . . , a n ) A=(a_{1},a_{2},...,a_{n}) A=(a1,a2,...,an), B = ( b 1 , b 2 , . . . , b n ) B=(b_{1},b_{2},...,b_{n}) B=(b1,b2,...,bn),则有:
余弦相似度
c o s ⟨ A , B ⟩ = A ⋅ B ∣ ∣ A ∣ ∣ × ∣ ∣ B ∣ ∣ = ∑ i = 1 n a i b i ∑ i = 1 n ( a i ) 2 × ∑ i = 1 n ( b i ) 2 cos\left \langle A,B \right \rangle={\frac {A \cdot B} {||A||\times||B||}}={\frac {\sum_{i=1}^{n}a_{i} b_{i}} {\sqrt {\sum_{i=1}^{n}\left (a_{i} \right )^2} \times \sqrt{\sum_{i=1}^{n}\left (b_{i} \right )^2}}} cos⟨A,B⟩=∣∣A∣∣×∣∣B∣∣A⋅B=∑i=1n(ai)2×∑i=1n(bi)2∑i=1naibi