两个月前我开始学习机器学习,这两个月期间学习了一些基础的机器学习算法及其Python实现。这周我刚开始学习《推荐系统实践》这本书,并打算以后定期将自己的学习情况做个简单的总结。这份总结是我这个博客上的第一篇文章。这周的学习的主要内容是基于邻域的协同过滤算法。基于用户行为分析的推荐算法是个性化推荐系统的重要算法,学术界一般将这种类型的算法称为协同过滤算法。
协同过滤,从名字就可以看出这种方法的本质是先有协同(用户齐心协力)再有过滤(每个用户的推荐列表能够过滤掉他不喜欢的物品)。对协同过滤算法,学术届提出了了很多种方法,比如基于邻域的方法(neighborhood-based)、隐语义模型(laten factor model)、基于图的随机游走算法(random walk on graph)等。
基于邻域的方法主要包括两种算法:基于用户的协同过滤算法(UserCF)和基于物品的协同过滤算法(ItemCF)。
基于用户的协同过滤算法(UserCF):
UserCF的本质就是我要给你推荐物品,我先找到与你兴趣最相似的K个用户,然后把他们喜欢的而你却没产生过行为的物品推荐给你。当然不是把所有的他们喜欢的且你没产生过行为的都推荐给你,而是推荐你最感兴趣的 N个产品。根据上面这些描述,我们看到使用 UserCF需要两步:
- 找到与你兴趣相似的K个用户。
- 确定你最感兴趣的N个物品?
在第一步中,我们需要去计算你与每个用户的兴趣相似度,然后按相似度降序排列,所对应的前K个用户就是我们要找的。
对于用户u和v我们可以通过如下的Jaccard公式来计算:
wuv=∣N(u)∩N(v)∣∣N(u)∪N(v)∣ ,
或者通过余弦相似度计算:
wuv=∣N(u)∩N(v)∣∣N(u)∪N(v)∣√ ,
计算相似度的时候,为了减少时间复杂度,需要建立一个物品-用户倒排表。因为当用户数很大时,直接从数据集很费时间,很多时间浪费在了计算 ∣N(u)∪N(v)∣=0 上。另外,两个用户对冷门物品采取过同样的行为更能说明他们兴趣的相似度。所以书中指出 John S. Breese 在论文中提出如下计算相似度的公式: