个性推荐系列目录:
个性推荐①——系统总结个性化推荐系统
个性推荐②—基于用户协同过滤算法原及优化方案
上一篇总结了基于用户的协同过滤算法原理及优化方案,本篇则整理了另一种基于领域的算法:基于物品的协同过滤,以及这两种方法的异同点及适用范围
一、算法原理
① 计算物品之间的相似度
② 基于物品的相似度和用户历史行为给用户生成推荐列表
二、物品相似度计算
通常认为物品相似,是因为物品在某些特征上相似,比如《琅琊榜》与《伪装者》在演员阵容上非常相似,因此会认为这两部剧很相似,这种认定相似的标准就叫基于内容或特征的相似度
在itemCF中,不同基于物品内容和特征计算相似度的,而是根据同时出现在用户兴趣列表中的次数,来计算物品之间的相似度
我们一般假设:如果两个物品同时出现一个用户的兴趣列表中,那么这两个物品可能属于有限的几个领域内,如果属于很多用户的兴趣列表,那么有可能属于某一类
尽管在计算过程中没有利用任何内容属性,但利用ItemCF计算的结果却是可以从内容上看出确实存在某种相似的。
计算公式如下:
上述公式想必大家都很熟悉,这不就是贝叶斯中的条件概率吗?购买过i的用户有多少会购买j。但这个公式有个问题,加入物品j是热门物品,那么所有i与j都会具有较高的相似度,那这样推荐列表往往都是热门物品,这与想要挖掘长尾物品的初衷不符,因此在皮基础上增加了对物品j的热门程度的惩罚项,降低了热门物品相似度
def ItemSimilarity(train):
#calculate co-rated users between items
C = dict()
N = dict()
for u, items in train.items():
for i in users:
N[i] += 1
for j in users:
if i == j:
continue
C[i][j] += 1
#calculate finial similarity matrix W
W = dict()
for i,related_items in C.items():
for j, cij in related_items.items():
W[u][v] = cij / math.sqrt(N