上一部分介绍了《推荐系统实践》中关于推荐系统常用的一些评测指标,那么从这一部分开始,将真正进入到推荐算法部分。
这个系列分为如下几个部分:
《推荐系统实践》算法纯享(附代码链接)(一)—— 评价指标篇
《推荐系统实践》算法纯享(附代码链接)(二)—— 协同过滤篇
《推荐系统实践》算法纯享(附代码链接)(三)—— 冷启动篇
《推荐系统实践》算法纯享(附代码链接)(四)—— UGC推荐篇
《推荐系统实践》算法纯享(附代码链接)(五)—— 借助上下文信息推荐篇
《推荐系统实践》算法纯享(附代码链接)(六)—— 借助社交网络推荐篇
《推荐系统实践》算法纯享(附代码链接)(七)—— 评分预测篇
完整代码链接:https://github.com/Magic-Bubble/RecommendSystemPractice
下面将开始本系列的第二部分——协同过滤篇。
文章目录
2 协同过滤
这里要先声明一点,仅仅基于用户行为数据设计的推荐算法一般称为协同过滤算法。
2.1 基于用户的协同过滤算法
代码链接:https://github.com/Magic-Bubble/RecommendSystemPractice/blob/master/Chapter2/基于用户的协同过滤算法.ipynb
主要包含两个步骤:
a. 计算用户之间的相似度:找到和目标用户兴趣相似的用户集合。
b. 根据用户相似度及用户对物品的评价为物品打分:找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户。
Step1: 计算用户相似度
根据协同过滤算法的定义,这里主要是利用用户行为的相似度来计算兴趣的相似度。给定用户u和用户v,令 N ( u ) N(u) N(u)和 N ( v ) N(v) N(v)分别表示用户u和用户v曾经有过正反馈的物品集合,则有如下三种方式计算相似度:
- Jaccard公式
w u v = N ( u ) ⋂ N ( v ) N ( u ) ⋃ N ( v ) w_{uv}=\frac{N(u) \bigcap N(v)}{N(u) \bigcup N(v)} wuv=N(u)⋃N(v)N(u)⋂N(v)
- 余弦相似度(UserCF算法)
w u v = N ( u ) ⋂ N ( v ) ∣ N ( u ) ∣ ∣ N ( v ) ∣ w_{uv}=\frac{N(u) \bigcap N(v)}{\sqrt{|N(u)||N(v)|}} wuv=∣N(u)∣∣N(v)∣N(u)⋂N(v)
- 改进的余弦相似度(UserIIF算法)
w u v = ∑ i ∈ N ( u ) ⋂ N ( v ) 1 l o g 1 + ∣ N ( i ) ∣ ∣ N ( u ) ∣ ∣ N ( v ) ∣ w_{uv}=\frac{\sum_{i\in{N(u) \bigcap N(v)}} \frac{1}{log1+|N(i)|}}{\sqrt{|N(u)||N(v)|}} wuv=∣N(u)∣∣N(v)∣∑i∈N(u)⋂N(v)log1+∣N(i)∣1
在UserIIF算法中, N ( i ) N(i) N(i)是物品i的热度,可见其对热门物品进行了惩罚,因为两个用户对冷门物品采取过同样的行为更能说明他们兴趣的相似度。
这里要强调一个工程实现上的Trick。在计算用户行为之间的相似度时,如果按照定义实现的话,需要对两两用户的行为集合进行统计,这样的时间复杂度为 O ( ∣ U ∣ ∗ ∣ U ∣ ) O(|U|*|U|) O(∣U∣∗∣U∣),但用户行为往往是十分稀疏的,很多用户之间的行为并没有交集,导致时间浪费在这些不必要的计算上。这时就可以建立Item-User的倒排表,这样在同一个Item下面的User两两之间一定是在这个Item上有交集的,所以只需要遍历所有的Item,对其下所有的User两两进行统计即可,这样可以极大降低时间复杂度。
Step2: 为物品打分
在统计完用户之间的相似度之后,就可以利用这种用户相似度以及用户对物品的评价为物品打分。其公式如下:
p ( u , i ) = ∑ v ∈ S ( u , K ) ⋂ N ( i ) w u v r v i p(u, i) = \sum_{v \in S(u, K) \bigcap N(i)}w_{uv}r_{vi} p(u,i)=v∈S(u,K)⋂N(i)∑wuvrvi
w u i w_{ui} wui表示用户u对物品i的感兴趣程度, S ( u , K ) S(u, K) S(u,K)表示和用户u兴趣最接近的K个用户, N ( i ) N(i) N(i)是对物品i有过行为的用户集合, w u v w_{uv} wuv是用户u和用户v的兴趣相似度, r v i r_{vi} rvi是用户v对物品i的兴趣。
在实现的时候,往往会取一个较小的K值,先召回一批物品,然后为这些物品中没出现在目标用户中的物品利用上述公式进行打分。
2.2 基于物品的协同过滤算法
代码链接:https://github.com/Magic-Bubble/RecommendSystemPractice/blob/master/Chapter2/基于物品的协同过滤算法.ipynb
与基于用户的协同过滤算法一样,基于物品的协同过滤算法也是基于邻域的一种做法。它也可以分为两步:
a. 计算物品之间的相似度。
b. 根据物品的相似度和用户的历史行为为用户生成推荐列表。
Step1: 计算物品相似度
计算物品相似度主要还是利用用户的行为数据,即比较对两个物品有过正反馈的用户集合的相似性。令 N ( i ) N(i) N(i