0%

推荐系统的引入

介绍推荐系统的背景和算法实践。

背景&条件

  1. 信息过载

    人们逐渐从信息匮乏的时代走入了信息过载[1],如何从大量信息中找到自己感兴趣的信息是一件非常困难的事情。

  2. 用户需求不明确

    当用户需求明确,虽然有信息过载,也可以使用搜索系统解决用户需求。

应用场景

  • 电子商务
  • 社交
  • 个性化音乐、图书、电影、邮件
  • 广告

系统评测

image-20190828135357751

  • 用户角度

    给用户推荐那些他们感兴趣的内容

  • 内容提供方角度

    各内容提供方都能够被推荐给对其感兴趣的用户

  • 网站角度

    推荐系统本身收集到高质量的用户反馈,自身系统不断迭代,提高推荐质量。从而产生效益。

推荐系统基础算法

基于邻域的算法

算法思想:物以类聚,人以群分

基本的协同过滤推荐算法基于以下假设:

  • “跟你喜好相似的人喜欢的东西你也很有可能喜欢” :基于用户的协同过滤推荐(User-based CF)
  • “跟你喜欢的东西相似的东西你也很有可能喜欢 ”:基于物品的协同过滤推荐(Item-based CF)

举例

备注

  1. 构建数据集:注意这里构建评分数据时,对于缺失的部分我们需要保留为None,如果设置为0那么会被当作评分值为0去对待
1
2
3
4
5
6
7
8
9
10
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. 计算相似度:对于评分数据这里我们采用皮尔逊相关系数[-1,1]来计算,-1表示强负相关,+1表示强正相关

    pandas中corr方法可直接用于计算皮尔逊相关系数,备注:按列计算!

1
2
3
4
5
6
7
8
9
10
11
12
13
df = pd.DataFrame(datasets,
columns=items,
index=users)

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

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

对应结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 运行结果:
用户之间的两两相似度:
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最相似的是用户2和用户3;与物品A最相似的物品分别是物品E和物品D。

基于用户的协同过滤算法(User-Based CF)

该方案考虑了用户本身的评分评分以及近邻用户的加权平均相似度打分来进行预测:

我们要预测用户1对物品E的评分,那么可以根据与用户1最近邻的用户2和用户3进行预测,计算如下:

最终预测出用户1对物品5的评分为3.91

基于物品的协同过滤算法(Item-Based CF)

这里利用物品相似度预测的计算同上,同样考虑了用户自身的平均打分因素,结合预测物品与相似物品的加权平均相似度打分进行来进行预测

我们要预测用户1对物品E的评分,那么可以根据与物品E最近邻的物品A和物品D进行预测,计算如下:

对比可见,User-Based CF预测评分和Item-Based CF的评分结果也是存在差异的,因为严格意义上他们其实应当属于两种不同的推荐算法。

各自在不同的领域不同场景下,都会比另一种的效果更佳,但具体哪一种更佳,必须经过合理的效果评估。个人认为二者也可以加上各自的权重,类似与机器学习中的集成学习boosting。

其他

皮尔逊相关系数Pearson

  • 实际上也是一种余弦相似度, 不过先对向量做了中心化, 向量a b 各自减去向量的均值后, 再计算余弦相似度
  • 皮尔逊相似度计算结果在-1,1之间 -1表示负相关, 1表示正相关
  • 度量两个变量是不是同增同减
  • 皮尔逊相关系数度量的是两个变量的变化趋势是否一致, 不适合计算布尔值向量之间的相关度

image-20190829010014701

参考&致谢

[1] 项亮. 推荐系统实践[M]. 2012.

佚名,黑马机器学习讲义

觉得不错?