推荐算法 - 基于邻域的协同过滤Collaborative Filter

1. 定义

1.1 userCF

  • userCF:基于用户的相似度,使用用户评分表,通过 group by 用户id,筛选出每位用户的标记过的物品列表,根据多个用户间的物品列表,计算相似度,取相似度靠前的k个邻居,根据这k个邻居的打分以及于其的相似度,得到相似度的加权得分。即为基于邻域的userCF

p ( u , i ) = ∑ v ∈ S ( u , K ) ∩ N ( i ) w u v r v i p(u,i) = \sum_{v\in{S(u,K)}\cap{N(i)}}{w_{uv}r_{vi}} p(u,i)=vS(u,K)N(i)wuvrvi
S ( u , K ) 表 示 和 用 户 u 兴 趣 最 接 近 的 K 个 用 户 S(u,K)表示和用户u兴趣最接近的K个用户 S(u,K)uK
N ( i ) 表 示 对 物 品 i 有 过 行 为 的 用 户 集 合 N(i)表示对物品i有过行为的用户集合 N(i)i
w u v 表 示 用 户 u 和 用 户 v 的 相 似 度 w_{uv}表示用户u和用户v的相似度 wuvuv
r v i 表 示 用 户 v 对 物 品 i 的 兴 趣 度 ( 评 分 ) r_{vi}表示用户v对物品i的兴趣度(评分) rvivi

1.2 itemCF

  • itemCF:基于物品的相似度,使用评分表,实现方式和UserCF类似,只是主体从用户换为了物品本身,根据物品进行group by,得到每个物品被用户评分的列表,根据计算用户列表的相似度,取靠前的k个邻居,根据这k个邻居的打分以及于其的相似度,得到相似度的加权得分。即为基于邻域的itemCF

p ( u , i ) = ∑ v ∈ S ( i , K ) ∩ N ( u ) w i j r u j p(u,i) = \sum_{v\in{S(i,K)}\cap{N(u)}}{w_{ij}r_{uj}} p(u,i)=vS(i,K)N(u)wijruj
S ( i , K ) 表 示 和 物 品 i 最 接 近 的 K 个 物 品 集 合 S(i,K)表示和物品i最接近的K个物品集合 S(i,K)iK
N ( u ) 表 示 用 户 u 感 兴 趣 的 物 品 集 合 N(u)表示用户u感兴趣的物品集合 N(u)u
w i j 表 示 物 品 i 和 物 品 j 的 相 似 度 w_{ij}表示物品i和物品j的相似度 wijij
r u j 表 示 用 户 u 对 物 品 j 的 兴 趣 度 ( 评 分 ) r_{uj}表示用户u对物品j的兴趣度(评分) rujuj

2. 基于集合的相似度计算方式

N(u),N(v)分别代表用户u和用户v有过正反馈的物品集合。

  • Jaccard相似度

w u v = ∣ N ( u ) ∩ N ( v ) N ( u ) ∪ N ( v ) ∣ w_{uv} = |\frac{N(u)\cap N(v)}{N(u)\cup N(v)}| wuv=N(u)N(v)N(u)N(v)

  • 余弦相似度

w u v = ∣ N ( u ) ∩ N ( v ) ∣ ∣ N ( u ) ∣ ∣ N ( v ) ∣ w_{uv} = \frac{|N(u)\cap N(v)|}{\sqrt{|N(u)||N(v)|}} wuv=N(u)N(v) N(u)N(v)

  • 基于流行度改进的相似度

在这里插入图片描述
通过 1 l o g ( 1 + ∣ N ( i ) ∣ ) \frac{1}{log(1+|N(i)|)} log(1+N(i))1对热门物品进行对相似度的惩罚

3. 基于邻域协同过滤的拓展算法

3.1 KNNBasic

KNNBasic基于相似度计算前k个邻居根据邻居对目标的分数进行加权求和进行排序
r ^ u i = ∑ v ∈ N i k ( u ) sim ( u , v ) ⋅ r v i ∑ v ∈ N i k ( u ) sim ( u , v ) \hat{r}_{ui} = \frac{ \sum\limits_{v \in N^k_i(u)} \text{sim}(u, v) \cdot r_{vi}} {\sum\limits_{v \in N^k_i(u)} \text{sim}(u, v)} r^ui=vNik(u)sim(u,v)vNik(u)sim(u,v)rvi
or
r ^ u i = ∑ j ∈ N u k ( i ) sim ( i , j ) ⋅ r u j ∑ j ∈ N u k ( i ) sim ( i , j ) \hat{r}_{ui} = \frac{ \sum\limits_{j \in N^k_u(i)} \text{sim}(i, j) \cdot r_{uj}} {\sum\limits_{j \in N^k_u(i)} \text{sim}(i, j)} r^ui=jNuk(i)sim(i,j)jNuk(i)sim(i,j)ruj

3.2 KNNMean

KNNMean基于Basic的计算方法,根据用户均值或是物品均值进行了偏差的调整
r ^ u i = μ u + ∑ v ∈ N i k ( u ) sim ( u , v ) ⋅ ( r v i − μ v ) ∑ v ∈ N i k ( u ) sim ( u , v ) \hat{r}_{ui} = \mu_u + \frac{ \sum\limits_{v \in N^k_i(u)} \text{sim}(u, v) \cdot (r_{vi} - \mu_v)} {\sum\limits_{v \in {N^k_i(u)}} \text{sim}(u, v)} r^ui=μu+vNik(u)sim(u,v)vNik(u)sim(u,v)(rviμv)
or
r ^ u i = μ i + ∑ j ∈ N u k ( i ) sim ( i , j ) ⋅ ( r u j − μ j ) ∑ j ∈ N u k ( i ) sim ( i , j ) \hat{r}_{ui} = \mu_i + \frac{ \sum\limits_{j \in N^k_u(i)} \text{sim}(i, j) \cdot (r_{uj} - \mu_j)} {\sum\limits_{j \in {N^k_u(i)}} \text{sim}(i, j)} r^ui=μi+jNuk(i)sim(i,j)jNuk(i)sim(i,j)(rujμj)

3.3 KNNZScore

KNNZScore基于Basic的计算方法,根据用户的z-score进行物品或用户的偏差影响的调整。
r ^ u i = μ u + σ u ∑ v ∈ N i k ( u ) sim ( u , v ) ⋅ ( r v i − μ v ) / σ v ∑ v ∈ N i k ( u ) sim ( u , v ) \hat{r}_{ui} = \mu_u + \sigma_u \frac{ \sum\limits_{v \in N^k_i(u)} \text{sim}(u, v) \cdot (r_{vi} - \mu_v) / \sigma_v} {\sum\limits_{v \in N^k_i(u)} \text{sim}(u, v)} r^ui=μu+σuvNik(u)sim(u,v)vNik(u)sim(u,v)(rviμv)/σv
or
r ^ u i = μ i + σ i ∑ j ∈ N u k ( i ) sim ( i , j ) ⋅ ( r u j − μ j ) / σ j ∑ j ∈ N u k ( i ) sim ( i , j ) \hat{r}_{ui} = \mu_i + \sigma_i \frac{ \sum\limits_{j \in N^k_u(i)} \text{sim}(i, j) \cdot (r_{uj} - \mu_j) / \sigma_j} {\sum\limits_{j \in N^k_u(i)} \text{sim}(i, j)} r^ui=μi+σijNuk(i)sim(i,j)jNuk(i)sim(i,j)(rujμj)/σj

3.4 KNNBaseline

KNNBaseline基于Basic的计算方法,根据Baseline的预估方法,根据用户对整体的偏差和物品对整体的偏差,对相似度的加权求和进行调整。
r ^ u i = b u i + ∑ v ∈ N i k ( u ) sim ( u , v ) ⋅ ( r v i − b v i ) ∑ v ∈ N i k ( u ) sim ( u , v ) \hat{r}_{ui} = b_{ui} + \frac{ \sum\limits_{v \in N^k_i(u)} \text{sim}(u, v) \cdot (r_{vi} - b_{vi})} {\sum\limits_{v \in {N^k_i(u)}} \text{sim}(u, v)} r^ui=bui+vNik(u)sim(u,v)vNik(u)sim(u,v)(rvibvi)
or
r ^ u i = b u i + ∑ j ∈ N u k ( i ) sim ( i , j ) ⋅ ( r u j − b u j ) ∑ j ∈ N u k ( i ) sim ( i , j ) \hat{r}_{ui} = b_{ui} + \frac{ \sum\limits_{j \in N^k_u(i)} \text{sim}(i, j) \cdot (r_{uj} - b_{uj})} {\sum\limits_{j \in {N^k_u(i)}} \text{sim}(i, j)} r^ui=bui+jNuk(i)sim(i,j)jNuk(i)sim(i,j)(rujbuj)
其中, b v i b_{vi} bvi b u j b_{uj} buj是基于Baseline算法根据SGD或ALS优化求解得到得到的:
b u i = μ + b u + b i b_{ui}=\mu+b_u+b_i bui=μ+bu+bi

∑ r u i ∈ R t r a i n ( r u i − ( μ + b u + b i ) ) 2 + λ ( b u 2 + b i 2 ) . \sum_{r_{ui} \in R_{train}} \left(r_{ui} - (\mu + b_u + b_i)\right)^2 + \lambda \left(b_u^2 + b_i^2 \right). ruiRtrain(rui(μ+bu+bi))2+λ(bu2+bi2).

4. 协同过滤的优缺点

  • 优点:

    • 基于邻域的协同过滤易于理解,容易实现,可解释性强
    • 在冷启动阶段,UserCF对于新加入的物品能很快进入推荐列表,ItemCF对新加入的用户可以很快进行推荐
    • 当用户数远大于物品数,优先使用itemCF;物品数远大于用户数,优先使用userCF
  • 缺点:

    • 由于大部分都是稀疏的,所以对于大部分稀疏评分的物品,都会推荐头部的热门物品,泛化能力弱
    • 除了物品和用户的评分交互以外,无法运用其他