步骤有2:

计算物品间的相似度。

根据相似度以及用户的历史行为给用户生成推荐列表。

相似度计算公式:

设N(i)、N(j)为喜欢或购买等与物品i、j发生正反馈行为的用户数量。

W(i,j)是i、j的相似度。

即:同时喜欢i、j的用户数量与喜欢i用户数量之比。

当然,考虑到长尾分布、为避免马太效应,有必要将热门物品降重,相似度公式可以为:

还记得


老程序员学习笔记,公众号:老程序员学习笔记
推荐系统之基于用户的协同过滤算法UserCF

讲UserCF时,有个物品-用户倒排表么,在ItemCF中,也可以构建一个用户-物品倒排表。

设有用户ABCD,物品a~f,二者关系如下:


A:a,c,d,e
B:c,e,f
C:a,b,d
D:b,e,f

则物品相似度矩阵:

以上是分子部分,最终结果:

计算用户u对物品j的兴趣度公式如下,设:

P(u,j)为用户u对物品j的兴趣度。
W(j,i)为物品j、i的相似度。
r(u,i)为u对i的兴趣度,例如购买过代表10,加入购物车8,收藏6,点赞4,浏览1等等。也可以是用户对物品的评分,比如电影评分等。本文为了描述简单,统一设为1。
N(u)为u喜欢的物品集。
S(j,K)为与j最相似的K个物品集。

以前面给出的数据进行计算,给用户A推荐物品,K=3。

未与A发生关联的物品为b、f,分别计算A对二者的兴趣度。

A喜欢的物品N(A)={a,c,d,e}。

b最相似的3个物品S(b,3)={a,d,f}。


P(A,b)=W(b,a)+W(b,d)=1
P(A,f)=W(f,c)+W(f,e)=0.5+2/√6>1

给A推荐f。

接着谈优化。

通过物品相似度公式可知,两个物品出现在越多的用户兴趣列表中,则相似度越高。

也即每个用户的兴趣列表都会对物品相似度产生影响。但这些影响的权重不应相同。

同前文之例,A用户买了10件婴儿用品,3件手办模型,难道尿不湿与高达模型就很相似吗?用户C购买手办的时候就要给他推荐奶粉?

所以用户A(活跃度高)对购买物品两两相似度的影响权重应小于C(活跃度低)。公式如下:

此即ItemCF-IUF。

当然了,如果有些人过于活跃,比如A用户是一位大酒店的采购员,基本上能把菜市场90%的东西都买了,这种用户的兴趣列表在计算相似度时,一般不计入计算了。

归一化:

还拿之前的例子说明。

我们知道婴儿用品中,奶粉和尿不湿等的相似度很高,假设为0.8。但在手办模型中,高达和初音未来的相似度就不那么高了,假设为0.4。

那么有用户买了10件婴儿用品,10件手办。如果给他推荐两个物品的话,理应是婴儿用品、手办模型各1。但现在只会给他推荐两个婴儿用品,因为婴儿用品间的相似度大于手办模型间的相似度。这样一来覆盖率就变低了。

为此我们要将不同种类物品的相似度,进行归一化。公式如下:

这就是ItemCF-Norm。

我们举例说明。

设有婴儿物品:尿不湿(简称:湿)、奶粉(粉)、奶瓶(瓶)、童装(装)。

手办模型:高达(高)、初音未来(初)、明日香(明)。

相似度矩阵如下:

婴儿用品间的相似度很高,手办模型则相对偏低。

设有用户A的兴趣列表{湿,粉,高,明},则待推荐的物品有{瓶,装,初}。

设K=3。


S(瓶,3)={湿,粉,装}
S(装,3)={湿,粉,瓶}
S(初,3)={高,明,粉}

P(A,瓶)=W(瓶,湿)+W(瓶,粉)=1.6
P(A,装)=W(装,湿)+W(装,粉)=1.2
P(A,初)=W(初,明)+W(初,高)+W(初,粉)=1.1

推荐奶瓶、童装。

接着我们进行归一化,结果矩阵如下:

P(A,瓶)=W(瓶,湿)+W(瓶,粉)=2
P(A,装)=W(装,湿)+W(装,粉)=1.5
P(A,初)=W(初,明)+W(初,高)=2

推荐奶瓶,初音未来。