基于协同过滤的推荐算法

2021-03-10  本文已影响0人  璐兮_cl
1. 基本思想

协同过滤推荐算法是最经典的推荐算法,它的算法思想为物以类聚,人以群分,基本的协同过滤算法基于以下的假设:

实现协同过滤的步骤:
1). 找到相似的Top-N个人或者物品:计算两两的相似度并进行排序
2). 根据相似的人或物品产生推荐结果:利用Top-N生成初始推荐结果,然后过滤掉用户已经有过记录或者明确表示不喜欢的物品

那么,如何计算相似度呢?

2. 相似度计算

根据数据类型的不同,相似度的计算方式也不同,数据类型有:

一般的,相似度计算有杰卡德相似度、余弦相似度、皮尔逊相关系数

余弦相似度和皮尔逊相关系数适合用户评分数据(实数值)
杰卡德相似度适用于隐式反馈数据(0,1 布尔值)

3. 关于用户-物品评分矩阵

在协同过滤推荐算法中,我们更多的是利用用户对物品的评分数据集,预测用户对没有评分过的物品的评分结果。

用户-物品的评分矩阵,根据评分矩阵的稀疏程度会有不同的解决方案。

使用协同过滤推荐算法预测评分-稠密评分矩阵

目的:预测用户1对于物品E的评分

步骤分析:

实现过程

  1. 构建数据集:注意构建评分矩阵时,对于缺失的部分需要保留为None,如果设置为0那么会被当做评分0
import pandas as pd

users = ["User1", "User2", "User3", "User4", "User5"]
items = ["Item A", "Item B", "Item C", "Item D", "Item E"]
# 用户购买记录数据集
datasets = [
    [5,3,4,4,None],
    [3,1,2,3,3],
    [4,3,4,3,5],
    [3,3,1,5,4],
    [1,5,5,2,1],
]
  1. 计算用户两两之间及物品两两之间相似度,对于评分数据这里我们采用皮尔逊相关系数

pandas中corr方法可直接用于计算皮尔逊相关系数

df = pd.DataFrame(datasets,index=users,columns=items)

print("用户之间的两两相似度:")
# 直接计算皮尔逊相关系数
# 默认是按列进行计算,因此如果计算用户间的相似度,当前需要进行转置
user_similar = df.T.corr()
user_similar.round(4)

print("物品之间的两两相似度:")
item_similar = df.corr()
item_similar.round(4)

用户之间的两两相似度:

- User1 User2 User3 User4 User5
User1 1.0000 0.8528 0.7071 0.0000 -0.7921
User2 0.8528 1.0000 0.4677 0.4900 -0.9001
User3 0.7071 0.4677 1.0000 -0.1612 -0.4666
User4 0.0000 0.4900 -0.1612 1.0000 -0.6415
User5 -0.7921 -0.9001 -0.4666 -0.6415 1.0000

物品之间的两两相似度:

- Item A Item B Item C Item D Item E
Item A 1.0000 -0.4767 -0.1231 0.5322 0.9695
Item B -0.4767 1.0000 0.6455 -0.3101 -0.4781
Item C -0.1231 0.6455 1.0000 -0.7206 -0.4276
Item D 0.5322 -0.3101 -0.7206 1.0000 0.5817
Item E 0.9695 -0.4781 -0.4276 0.5817 1.0000
  1. 评分预测
    基于用户相似度计算 用户1对于商品E的评分
    1).根据user_similar获取用户1相似的两个用户为:User2,User3
    2).User2,User3对商品E的评分分别为3.0和5.0
    3).计算用户1对于商品E的评分:(0.85283.0+0.70715.0)/(0.8528+0.7071)=3.91

    基于物品相似度计算 用户1对于商品E的评分
    1).根据item_similar获取商品E相似的两个商品为商品A和商品D
    2).用户1对于商品A和商品D的评分分别为5和4
    3).计算用户1对于商品E的评分:(0.96955+0.58174)/(0.9695+0.5817)=4.625

对比可见,User-based CF 和 Item-based CF 的结果是有差异的,因为严格意义上他们应该是属于两种不同的推荐算法,各自在不同的领域,会比另一种更佳,但是具体场景下哪种更合适,需要进行合理的评估,因此在实现推荐系统时,这两种算法往往都是需要实现的,然后根据推荐的效果分析选出更优方案。

对于稀疏矩阵,使用基于模型的协同过滤是更高级的算法,如基于图的模型、基于矩阵分解的方法,这个下篇文章再介绍。
上一篇下一篇

猜你喜欢

热点阅读