一文搞懂基于用户的协同过滤推荐算法

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

  1. 找到和待推荐用户相似的用户群;
  2. 找到这个用户群中用户感兴趣的,且待推荐用户没购买过的物品。

为便于理解,本文后面示例的计算中使用下面数据: 第一列为索引,userId是用户标识,itemsId表是用户购买过的物品ID。
一文搞懂基于用户的协同过滤推荐算法

1. 用户相似度计算

        给定用户uu和用户vv,令N(u)N(u)表示用户uu点击过的物品集合,令N(v)N(v)为用户vv点击过的物品集合

余弦相似度
Wu,v=N(u)N(v)N(u)N(v) W_{u,v} = \frac{|N(u) \bigcap N(v)|} {\sqrt{|N(u)| | N(v)|}}         其中|*|表示取模,即物品的个数。

Jaccard公式
Wu,v=N(u)N(v)N(u)N(v) W_{u,v} = \frac{|N(u) \bigcap N(v)|} {|N(u) \bigcup N(v)|}
【例】根据上述数据,生成每个用户购买过的商品列表
一文搞懂基于用户的协同过滤推荐算法
        可据此计算用户相似度,例如计算用户A和B的余弦相似度
WA,B={1,2,5}{1,3,4}{1,2,5}{1,3,4}=13 W_{A,B} = \frac{| \{1,2,5\} \bigcap \{1,3,4\} |} {\sqrt{| \{1,2,5\}| | \{1,3,4\} |}} = \frac{1} {3}
        上面公式中需要对任意两个用户计算相似度,这种方法的时间复杂度是O(U2)O(U^2),其中UU标识用户数。当用户数量大时,计算起来会很费时。其实,并不是所有用户购买过的物品都有交集,即存在N(u)N(v)=0|N(u) \bigcap N(v)|=0。因此,可以先计算出N(u)N(v)0|N(u) \bigcap N(v)| \neq 0的用户对(u,v)(u,v),然后再除以相似度中的分母得到用户的相似度矩阵。

用户相似度计算的步骤如下:

  1. 建立物品到用户的倒排表,对于每个物品,保存购买过该物品的用户列表;
            【例】生成商品到用户的倒排表
    一文搞懂基于用户的协同过滤推荐算法
  2. 初始化用户相似度矩阵WWUUU*U维度的全零矩阵,遍历倒排表,对每个物品对应的用户列表求2个元素的排列,然后将每个排列值作为WW的索引进行加1。(例如物品I对应的用户列表为[a,b],则排列为{(a,b)},更新W[a][b]=W[a][b]+1W[a][b]=W[a][b]+1和$W[b][a]=W[b][a]+1W[b][a]=W[b][a]+1
            【例】根据倒排表生成用户间相同商品购买量统计矩阵
    一文搞懂基于用户的协同过滤推荐算法
  3. 步骤2执行结束后,得到的是每个用户与其他用户购买相同商品的个数,即相似度的分子,要计算相似度,还需要处于分母。以余弦相似度为例,遍历WW的下三角矩阵(或是上三角矩阵),计算simu,v=W[u][v]/N(u)N(v)sim_{u,v}=W[u][v] / \sqrt{|N(u)||N(v)|},其中u,vu,vWW的索引。更新W[u][v]=W[v][u]=simu,vW[u][v] = W[v][u] = sim_{u,v}
            【例】 除以计算相似度的分母,得到相似度矩阵
    一文搞懂基于用户的协同过滤推荐算法

2. 生成推荐列表

根据用户相似度,计算待推荐用户uu对与其最相似的KK个用户购买过商品ii的感兴趣程度:
p(u,i)=vS(u.K)N(i)Wu,vrv,i p(u,i) = \sum_{v \in S(u.K) \bigcap N(i)}W_{u,v}r_{v,i} 其中,S(u.K)S(u.K)为和用户uu兴趣最接近的KK个用户,rv,ir_{v,i}代表用户对物品ii的兴趣,因为只是用了行为数据,所以rv,i=1r_{v,i}=1.
        【例】生成推荐列表
一文搞懂基于用户的协同过滤推荐算法