本文针对无上下文信息的隐性反馈数据集(每一条行为记录仅仅包含用户ID和物品ID),介绍基于用户的协同过滤算法原理。
基于用户的协同过滤推荐算法本质:找到和待推荐用户相似的用户群,推进该用户群感兴趣且待推荐用户没购买过的物品。例如下图中, 用户a购买过物品A、C,用户c购买过物品A、C、D ,则用户a和用户c比较相似,可以考虑把物品D推荐给用户a。

基本步骤:
- 找到和待推荐用户相似的用户群;
- 找到这个用户群中用户感兴趣的,且待推荐用户没购买过的物品。
为便于理解,本文后面示例的计算中使用下面数据: 第一列为索引,userId是用户标识,itemsId表是用户购买过的物品ID。

1. 用户相似度计算
给定用户u和用户v,令N(u)表示用户u点击过的物品集合,令N(v)为用户v点击过的物品集合
余弦相似度
Wu,v=∣N(u)∣∣N(v)∣∣N(u)⋂N(v)∣ 其中∣∗∣表示取模,即物品的个数。
Jaccard公式
Wu,v=∣N(u)⋃N(v)∣∣N(u)⋂N(v)∣
【例】根据上述数据,生成每个用户购买过的商品列表

可据此计算用户相似度,例如计算用户A和B的余弦相似度
WA,B=∣{1,2,5}∣∣{1,3,4}∣∣{1,2,5}⋂{1,3,4}∣=31
上面公式中需要对任意两个用户计算相似度,这种方法的时间复杂度是O(U2),其中U标识用户数。当用户数量大时,计算起来会很费时。其实,并不是所有用户购买过的物品都有交集,即存在∣N(u)⋂N(v)∣=0。因此,可以先计算出∣N(u)⋂N(v)∣=0的用户对(u,v),然后再除以相似度中的分母得到用户的相似度矩阵。
用户相似度计算的步骤如下:
- 建立物品到用户的倒排表,对于每个物品,保存购买过该物品的用户列表;
【例】生成商品到用户的倒排表
- 初始化用户相似度矩阵W为U∗U维度的全零矩阵,遍历倒排表,对每个物品对应的用户列表求2个元素的排列,然后将每个排列值作为W的索引进行加1。(例如物品I对应的用户列表为[a,b],则排列为{(a,b)},更新W[a][b]=W[a][b]+1和$W[b][a]=W[b][a]+1)
【例】根据倒排表生成用户间相同商品购买量统计矩阵
- 步骤2执行结束后,得到的是每个用户与其他用户购买相同商品的个数,即相似度的分子,要计算相似度,还需要处于分母。以余弦相似度为例,遍历W的下三角矩阵(或是上三角矩阵),计算simu,v=W[u][v]/∣N(u)∣∣N(v)∣,其中u,v为W的索引。更新W[u][v]=W[v][u]=simu,v。
【例】 除以计算相似度的分母,得到相似度矩阵
2. 生成推荐列表
根据用户相似度,计算待推荐用户u对与其最相似的K个用户购买过商品i的感兴趣程度:
p(u,i)=v∈S(u.K)⋂N(i)∑Wu,vrv,i其中,S(u.K)为和用户u兴趣最接近的K个用户,rv,i代表用户对物品i的兴趣,因为只是用了行为数据,所以rv,i=1.
【例】生成推荐列表
