1 什么是协同过滤算法
协同过滤算法是指根据用户过去的喜好或兴趣相近的用户的选择来进行推荐。根据用户过去的喜好来推荐,简单来说就是,如果用户过去购买过物品A,而物品B与物品A有着相似的特点(注意这里的特点与物品本身的属性无关,指的是不同用户对物品A和物品B的行为是相似的,例如各个用户对物品A和物品B的评分相似),那么我们就把物品B推荐给该用户,这就是基于物品的协同过滤算法(ItemCF)。根据兴趣相近的用户的选择来推荐,就是指如果用户A和用户B对于各个物品的行为(例如评分或浏览时长等)是相似的,而用户A喜欢物品C,我们就把物品C推荐给用户B,这就是基于用户的协同过滤算法(UserCF)。
2 如何衡量相似性
于是,问题就来了,我们要怎么判断两个用户或两个物品相似呢?我们可以通过三种方法来衡量相似性。
2.1 杰卡德(Jaccard)相似系数
杰卡德相似系数计算两用户u和v共同购买或喜爱的物品数量占他们二者总共购买或喜爱的物品数量的比值。其计算公式如下:
但是杰卡德相似系数只能判断用户是否会购买或喜爱某个物品,而无法给出用户对该物品的具体评分。
2.2 余弦相似度
余弦相似度是一种数学中常用的方法,用于计算两个向量之间的夹角,若夹角较小,那么该夹角的余弦就大,就说明两个向量越相似。其计算公式如下:
这里的u和v指的是用户u和用户v关于所有物品的评分向量。
2.3 皮尔逊相关系数
余弦相似度只考虑了用户的评分,但是不同用户的评分原则是不一样的,有些用户喜欢打高分,而另一些用户可能会比较挑剔,打分都偏低,这就导致光看用户的评分并不能判断该用户对某物品的喜爱程度。于是,皮尔逊相关系数采用用户评分的平均值来进行修正,根据用户评分与平均值的差值来计算相似度,其计算公式如下:
皮尔逊相关系数与余弦相似度的计算方法类似,都是计算两向量夹角的余弦值,不同的是皮尔逊相关系数计算的是两用户评分与平均值的差值向量的夹角余弦。
接下来,我们分别采用UserCF和ItemCF算法,根据以下用户-物品评分表,来预测user1对item7的评分,根据预测的评分判断是否要将item7推荐给user1。
User\Item | item1 | item2 | item3 | item4 | item5 | item6 | item7 |
---|---|---|---|---|---|---|---|
user1 | 4 | 5 | 1 | 4 | 2 | 3 | None |
user2 | 2 | 2 | 4 | 3 | 5 | 5 | 3 |
user3 | 5 | 5 | 2 | 4 | 1 | 2 | 1 |
user4 | 3 | 4 | 5 | 1 | 3 | 2 | 2 |
user5 | 1 | 2 | 5 | 5 | 4 | 5 | 2 |
user6 | 4 | 5 | 3 | 1 | 3 | 1 | 3 |
user7 | 2 | 3 | 1 | 5 | 5 | 3 | 5 |
3 基于用户的协同过滤算法(UserCF)
UserCF算法主要有两个步骤:
- 计算目标用户user1与其他用户之间的相似度,取相似度高的前K个用户作为评分预测的依据
- 根据这K个用户对item7的评分来预测user1对item7的评分
要预测user1对item7的评分,我们首先刨掉各用户的item7的评分数据,计算其他用户对除item7以外物品的评分与user1对除item7以外物品的评分的相似度。
usercf_data = data.drop('item7', axis=1)
usercf_data
然后计算其他用户与user1的相似度,这里采用皮尔逊相关系数。