写此专栏,是为了总结我对推荐系统这块的学习路线,从机器学习到深度学习的演变,包括文档演示和具体代码。
(图一)
我画了一个思维导图,如图一所示,这一小节,先介绍协同过滤,代码地址:model_zoo/CF at main · WUYvonne/model_zoo · GitHub
共现矩阵定义如下:
共现矩阵(5个用户评价了6个商品,评分为1~10的整数值,0表示评分不存在) | |||||||||
item_id | item_1 | item_2 | item_3 | item_4 | item_5 | item_6 | |||
user_id | |||||||||
user_1 | 3 | 1 | 2 | 3 | 3 | 3 | |||
user_2 | 4 | 3 | 4 | 3 | 5 | 2 | |||
user_3 | 3 | 3 | 1 | 5 | 4 | 1 | |||
user_4 | 1 | 5 | 5 | 2 | 1 | 5 | |||
user_5 | 5 | 3 | 4 | ??? | 4 | ??? |
1、UserCF
1.1 基于用户的协同过滤算法步骤:
已知,根据历史数据,有以用户为行坐标(m行),物品为列坐标(n列)m*n 维的共现矩阵。
Step1: 根据已有评分的历史数据,计算m*m维的用户相似矩阵,并找到和目标用户兴趣相似的top_n个用户
Step2: 根据相似用户的相似度和评分对所要推荐物品的进行加权计算获得最终得分,排序后产生推荐列表
举个例子,以上共现矩阵中,对user_5进行推荐一个物品,即预测user_5对item_4,itme_6的评分,根据评分排序后产生优先推荐给user_5的物品。
第一步,找出与user_5相似的top_n个用户,涉及到的是“用户相似度计算”。
1.2 常用的相似度计算:
(1) 余弦相似度
它计算的两个向量之间的向量家教大小,也就是说夹角越小,两个向量之间的相似度越大,两个用户越相似。
(2) 皮尔逊相关系数
相较于余弦相似度,皮尔逊相关系数通过使用用户的平均分对评分做了修正来减小用户评分偏置的影响。
代表用户 i 对物品 p 的评分。
代表用户 i 对所有物品的平均评分。P 表示所有物品的集合。
第二步,推算user_5对tem_4,tem_6的分数,即根据相似的n个用户的已有评价对user_5的偏好进行预测。最常用的方法是“利用用户相似度和相似用户的评价加权平均获得用户的评价预测”。公式表达如下:
代表用户 u 和用户 s 的相似度。
是用户 s 对物品 p 的评分,P 表示所有物品的集合。由这个公式,我们可以得到用户u 对所有物品的评价预测,并得到一个推荐列表,根据这个列表,再进行排序后,即可得到推荐给用户u 让他最感兴趣的物品。
但是,考虑到用户心理的评分标准不一,有的用户喜欢打高分,有的用户喜欢打低分,因此加入“物品的评分与此用户的所有评分的差值进行加权平均”,公式表达如下:
该公式中, 代表用户 u 对所有物品的平均评分,
表示用户 u 和用户 s 的相似度,用户 s 即top_n个与用户 u 相似的用户。
表示用户 s 对物品 p 的评分,
表示用户 s 对所有物品的平均评分。
UserCF算法的缺点也显而易见,(1)互联网场景下,用户量很大,计算相似用户费时间,其次用户相似度矩阵的存储开销也很大。(2)用户历史数据稀疏,并不是所有的用户都会对物品发生点击或者购买行为,因此找到相似用户的准确率也很低。
1.3 具体实现:
(1) 计算相似用户
已知用户向量,
user_1:(3, 1, 2, 3) |
user_2:(4, 3, 4, 5) |
user_3:(3, 3, 1, 4) |
user_4:(1, 5, 5, 1) |
user_5:(5, 3, 4, 4) |
举例计算user_5 和user_1的余弦相似性:
计算user_5 和user_1的皮尔逊相关系数:Ave(user_5) = 4,修正后user_5: (1, -1, 0, 0),Ave(user_1) = 2.25,修正后user_1: (0.75, -1.25, -0.25, 0.75)
由此,我们可以得到与user_5相似的用户,如果取n=2,即可得到与user_5相似的top 2个用户为user_2和user_1。
(2)计算相似用户对物品的评分
相似的top 2个用户对item_4的评分,user_1对item_4的评分为3,user_2对item_4的评分为3,根据公式3,计算user_5对item_4的评分为:
同理可得user_5对item_6的评分为:2.49,所以这时候如果要推荐给user_5一个物品,则会推荐item_4。根据公式4,计算user_5对item_4的评分为:
2、ItemCF
2.1 基于物品的协同过滤算法步骤:
基于物品的协同过滤算法的基本思路是根据所有用户的历史偏好数据计算物品之间的相似性,然后把与用户喜欢的物品相类似的物品推荐给用户,具体步骤如下:
已知,根据历史数据,有以用户为行坐标(m行),物品为列坐标(n列)m*n 维的共现矩阵。
Step1: 计算共现矩阵中物品和物品之间的相似度(计算方式同用户相似度),构建n*n维的物品相似度矩阵
Step2: 利用物品相似度矩阵,找出top_n个相似物品的集合
Step3: 对相似物品集合中的物品,利用相似度分值排序后得到推荐列表
注意:Item CF算法并不利用物品的内容属性计算物品之间的相似度,主要通过分析用户的行为记录计算物品之间的相似度
2.2 具体实现:
使用Item CF算法预测user_5对item_4和item_6的打分,计算与item_4和item_6相近的top_n个物品根据上述共现矩阵,已知物品向量表示如下:
item_1:(3, 4, 3, 1) |
item_2:(1, 3, 3, 5) |
item _3:(2, 4, 1, 5) |
item_4:(3, 3, 5, 2) |
item_5:(3, 5, 4, 1) |
item_6:(3, 2, 1, 5) |
得到与item_4最相似的2个物品为item_5和itme_1,其余弦相似度分别为:
('item_4', 'item_5'): 0.94 |
('item_4', 'item_1'):0.937 |
根据公式5,得到user_5对item_4的评分 ,
表示用户u对物品p分评分,
为待评价物品 p 历史平均分,S为与待评分物品p相似的top_n个物品的集合,
表示物品 p 与其相似物品集合 S 中的物品的相似度,
表示用户u 对相似物品s 的评分,
为物品 s 的历史平均分,由此可得user_5对item_4的评分如下:
同理可得user_5对item_6的评分为3.16