推荐算法 - 基于邻域的协同过滤Collaborative Filter
推荐算法 - 基于邻域的协同过滤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)∑wuvrvi
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)∑wijruj
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+σuv∈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+σij∈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
-
缺点:
- 由于大部分都是稀疏的,所以对于大部分稀疏评分的物品,都会推荐头部的热门物品,泛化能力弱
- 除了物品和用户的评分交互以外,无法运用其他