推荐算法 - 基于邻域的协同过滤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)=v∈S(u,K)∩N(i)∑​wuv​rvi​
S ( u , K ) 表 示 和 用 户 u 兴 趣 最 接 近 的 K 个 用 户 S(u,K)表示和用户u兴趣最接近的K个用户 S(u,K)表示和用户u兴趣最接近的K个用户
N ( i ) 表 示 对 物 品 i 有 过 行 为 的 用 户 集 合 N(i)表示对物品i有过行为的用户集合 N(i)表示对物品i有过行为的用户集合
w u v 表 示 用 户 u 和 用 户 v 的 相 似 度 w_{uv}表示用户u和用户v的相似度 wuv​表示用户u和用户v的相似度
r v i 表 示 用 户 v 对 物 品 i 的 兴 趣 度 ( 评 分 ) r_{vi}表示用户v对物品i的兴趣度(评分) rvi​表示用户v对物品i的兴趣度(评分)

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)=v∈S(i,K)∩N(u)∑​wij​ruj​
S ( i , K ) 表 示 和 物 品 i 最 接 近 的 K 个 物 品 集 合 S(i,K)表示和物品i最接近的K个物品集合 S(i,K)表示和物品i最接近的K个物品集合
N ( u ) 表 示 用 户 u 感 兴 趣 的 物 品 集 合 N(u)表示用户u感兴趣的物品集合 N(u)表示用户u感兴趣的物品集合
w i j 表 示 物 品 i 和 物 品 j 的 相 似 度 w_{ij}表示物品i和物品j的相似度 wij​表示物品i和物品j的相似度
r u j 表 示 用 户 u 对 物 品 j 的 兴 趣 度 ( 评 分 ) r_{uj}表示用户u对物品j的兴趣度(评分) ruj​表示用户u对物品j的兴趣度(评分)

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​=v∈Nik​(u)∑​sim(u,v)v∈Nik​(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​=j∈Nuk​(i)∑​sim(i,j)j∈Nuk​(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​+v∈Nik​(u)∑​sim(u,v)v∈Nik​(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​+j∈Nuk​(i)∑​sim(i,j)j∈Nuk​(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​+σu​v∈Nik​(u)∑​sim(u,v)v∈Nik​(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​+σi​j∈Nuk​(i)∑​sim(i,j)j∈Nuk​(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​+v∈Nik​(u)∑​sim(u,v)v∈Nik​(u)∑​sim(u,v)⋅(rvi​−bvi​)​
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​+j∈Nuk​(i)∑​sim(i,j)j∈Nuk​(i)∑​sim(i,j)⋅(ruj​−buj​)​
其中, 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). rui​∈Rtrain​∑​(rui​−(μ+bu​+bi​))2+λ(bu2​+bi2​).

4. 协同过滤的优缺点

  • 优点:

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

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