一文搞懂基于用户的协同过滤推荐算法
本文针对无上下文信息的隐性反馈数据集(每一条行为记录仅仅包含用户ID和物品ID),介绍基于用户的协同过滤算法原理。
基于用户的协同过滤推荐算法本质:找到和待推荐用户相似的用户群,推进该用户群感兴趣且待推荐用户没购买过的物品。例如下图中, 用户a购买过物品A、C,用户c购买过物品A、C、D ,则用户a和用户c比较相似,可以考虑把物品D推荐给用户a。
基本步骤:
- 找到和待推荐用户相似的用户群;
- 找到这个用户群中用户感兴趣的,且待推荐用户没购买过的物品。
为便于理解,本文后面示例的计算中使用下面数据: 第一列为索引,userId是用户标识,itemsId表是用户购买过的物品ID。
1. 用户相似度计算
给定用户和用户,令表示用户点击过的物品集合,令为用户点击过的物品集合
余弦相似度
其中表示取模,即物品的个数。
Jaccard公式
【例】根据上述数据,生成每个用户购买过的商品列表
可据此计算用户相似度,例如计算用户A和B的余弦相似度
上面公式中需要对任意两个用户计算相似度,这种方法的时间复杂度是,其中标识用户数。当用户数量大时,计算起来会很费时。其实,并不是所有用户购买过的物品都有交集,即存在。因此,可以先计算出的用户对,然后再除以相似度中的分母得到用户的相似度矩阵。
用户相似度计算的步骤如下:
- 建立物品到用户的倒排表,对于每个物品,保存购买过该物品的用户列表;
【例】生成商品到用户的倒排表 - 初始化用户相似度矩阵为维度的全零矩阵,遍历倒排表,对每个物品对应的用户列表求2个元素的排列,然后将每个排列值作为的索引进行加1。(例如物品I对应的用户列表为[a,b],则排列为{(a,b)},更新和$)
【例】根据倒排表生成用户间相同商品购买量统计矩阵 - 步骤2执行结束后,得到的是每个用户与其他用户购买相同商品的个数,即相似度的分子,要计算相似度,还需要处于分母。以余弦相似度为例,遍历的下三角矩阵(或是上三角矩阵),计算,其中为的索引。更新。
【例】 除以计算相似度的分母,得到相似度矩阵
2. 生成推荐列表
根据用户相似度,计算待推荐用户对与其最相似的个用户购买过商品的感兴趣程度:
其中,为和用户兴趣最接近的个用户,代表用户对物品的兴趣,因为只是用了行为数据,所以.
【例】生成推荐列表