1、介绍
1.1 隐式反馈推荐
我们可以用矩阵的形式表示用户的隐式反馈
如果我们可以估计矩阵中缺失的值(用“?”表示),或者直接对条目进行排序,我们就可以为每个用户做出推荐。
1.2 符号表示
2、相似度测量
2.1 Jaccard 系数
Jaccard index , 又称为Jaccard相似系数(Jaccard similarity coefficient)用于比较有限样本集之间的相似性与差异性。Jaccard系数值越大,样本相似度越高。
- 项目 k k k 和项目 j j j 之间的相似度计算公式:
S k j = U k ∩ U j U k ∪ U j = 同时喜欢 k 和 j 的用户数 至少喜欢一个的用户数 S_{kj}=\frac{\mathcal{U_k}\cap \mathcal{U_j} }{\mathcal{U_k}\cup \mathcal{U_j}}=\frac{同时喜欢k和j的用户数}{至少喜欢一个的用户数} Skj=Uk∪UjUk∩Uj=至少喜欢一个的用户数同时喜欢k和j的用户数
- S k j S_{kj} Skj 的默认值为 0 。
2.2 余弦相似度
- 项目 k k k 和项目 j j j 之间的余弦相似度计算公式:
S k j = U k ∩ U j U k U j S_{kj}=\frac{\mathcal{U_k}\cap \mathcal{U_j} }{\sqrt{\mathcal{U_k} } \sqrt{\mathcal{U_j}} } Skj=UkUjUk∩Uj
- S k j S_{kj} Skj 的默认值为 0 。
2.4 余弦相似度(加入惩罚机制)
- 项目 k k k 和项目 j j j 之间的余弦相似度计算公式:
S k j = U k ∩ U j U k α U j 1 − α S_{kj}=\frac{\mathcal{U_k}\cap \mathcal{U_j} }{\sqrt{\mathcal{U_k} }^\alpha \sqrt{\mathcal{U_j}} ^{1-\alpha }} Skj=UkαUj1−αUk∩Uj
其中 0.5 ≤ α ≤ 1 0.5\le \alpha \le 1 0.5≤α≤1
- 备注
- 当 0.5 = α 0.5=\alpha 0.5=α 时,这就是普通的余弦相似度计算公式;
- 当 α > 0.5 \alpha > 0.5 α>0.5 时,就相当于给受欢迎项目 k k k 一个惩罚权重;
- 当 α = 1 \alpha =1 α=1 时,它降低了关联规则挖掘的置信度;
2.5 余弦相似度(逆用户频率)
-
项目 k k k 和项目 j j j 之间的余弦相似度计算公式:
S k j = ∑ w ∈ U k ∩ U j 1 log ( 1 + ∣ I w ∣ ) U k α U j 1 − α \large S_{kj}=\frac{ {\textstyle \sum_{w\in \mathcal{U_k}\cap \mathcal{U_j}}^{}} \frac{1}{\log_{}{(1+|\mathcal{I_w} |)} } }{\sqrt{\mathcal{U_k} }^\alpha \sqrt{\mathcal{U_j}} ^{1-\alpha }} Skj=UkαUj1−α∑w∈Uk∩Ujlog(1+∣Iw∣)1解释:普通余弦相似度计算公式中分子部分一个用户算1分,现在引入用户的喜欢项目数作为计算,越多分子的值越小,一直小于1。
-
备注:这是一个在检索领域非常出名的技巧。
2.6 关联规则挖掘的置信度
- 一个喜欢项目 k k k 的用户也会喜欢项目 j j j 的置信度计算公式:
S k j = ∣ U k ∩ U j ∣ ∣ U k ∣ = 同时喜欢 k 和 j 的用户数 喜欢 k 的用户数 S_{kj}=\frac{|\mathcal{U}_k\cap \mathcal{U}_j| }{|\mathcal{U}_k|}=\frac{同时喜欢k和j的用户数}{喜欢k的用户数} Skj=∣Uk∣∣Uk∩Uj∣=喜欢k的用户数同时喜欢k和j的用户数
- 备注
- 关联规则挖掘可以看作是基于条目的OCCF的一种特殊情况;
- 也支持定义为 S k j = ∣ U k ∩ U j ∣ ∣ U ∣ S_{kj}=\frac{|\mathcal{U}_k\cap \mathcal{U}_j| }{|\mathcal{U}|} Skj=∣U∣∣Uk∩Uj∣;
2.7 标准化
- 当我们有一个相似度评分矩阵 [ s k j ] m × m , k , j = 1 , … , m \left[s_{kj}\right]_{m \times m}, k, j=1, \ldots, m [skj]m×m,k,j=1,…,m 时,我们可以将相似性标准化如下:
s ˉ k j = s k j max j ′ , j ′ ≠ k s k j ′ \large\bar{s}_{k j}=\frac{s_{k j}}{\max _{j^{\prime}, j^{\prime} \neq k} s_{k j^{\prime}}} sˉkj=maxj′,j′=kskj′skj
- 备注
- 这并不是一个整体标准化,例如 s k j max k ′ , j ′ s k ′ j ′ \frac{s_{k j}}{\max _{k^{\prime}, j^{\prime}} s_{k^{\prime} j^{\prime}}} maxk′,j′sk′j′skj 。因为当 j = k j=k j=k 时代表项目与本身的相似度,这个计算出来没有意义
3、计算方法
3.1 邻居选择
- 相似度计算选择与项目 j j j 最临近的 k k k 个项目 N j \mathcal{N_j} Nj。
3.2 基于项目的OCCF
- 预测规则
r ^ u j = ∑ k ∈ I u ∩ N j s k j \large\hat{r}_{u j}=\sum_{k \in \mathcal{I}_{u} \cap \mathcal{N}_{j}} s_{k j} r^uj=k∈Iu∩Nj∑skj
其中 s k j s_{k j} skj 就是项目 i i i 和项目 j j j 的相似度或者关联规则挖掘的置信度。
- 注意到有时会 ∣ I u ∩ N j ∣ < K \left|\mathcal{I}_{u} \cap \mathcal{N}_{j}\right|<K ∣Iu∩Nj∣<K ,但是在OCCF中通常是被允许的。
3.3 基于用户的OCCF
- 预测规则
r ^ u j = ∑ w ∈ U j ∩ N u s w u \large\hat{r}_{u j}=\sum_{w\in\mathcal{U}_j\cap \mathcal{N}_u}^{} s_{wu} r^uj=w∈Uj∩Nu∑swu
其中 s w u s_{wu} swu 就是用户 w w w 和用户 u u u 的相似度或者关联规则挖掘的置信度。 U j ∩ N u \mathcal{U}_j\cap \mathcal{N}_u Uj∩Nu 表示既是喜欢项目 j j j 的用户,也是 u u u 的邻居。
- 注意到有时会 ∣ U j ∩ N u ∣ < K \left|\mathcal{U}_{j} \cap \mathcal{N}_{u}\right|<K ∣Uj∩Nu∣<K ,但是在OCCF中通常是被允许的。
4、实验
4.1 数据集
- 我们分别使用MovieLens100K 的u1.base和u1.test作为训练集和测试集
- 用户数量:n=943;项目数量:m=1682;
- u1.base中共有80000条评分记录,密度为5.04%(80000/943/1682)
- u1.test中共有20000条评分记录
- 只保留评分为4/5的的数据项,其他移除。最后我们得到u1.base.OCCF 和 u1.test.OCCF
4.2 实施细节
- 如果我们使用基于项目的方法,隐式反馈如何存储?
- 计算两个项目之间的相似度 S k j : U k , U j S_{kj}:\mathcal{U}_k, \mathcal{U}_j Skj:Uk,Uj
- 预测评分 r ^ u j : I u , N j \hat{r}_{u j}:\mathcal{I}_u, \mathcal{N}_j r^uj:Iu,Nj
- 如果我们使用基于用户的方法,隐式反馈如何存储?
- 计算两个用户之间的相似度 S w u : I w , I u S_{wu}:\mathcal{I}_w, \mathcal{I}_u Swu:Iw,Iu
- 预测评分 r ^ u j : U j , N u \hat{r}_{u j}:\mathcal{U}_j, \mathcal{N}_u r^uj:Uj,Nu
4.3 评价方法
- Pre@5
用户
u
u
u 的预测精确度计算公式定义如下:
Pre
u
@
k
=
1
k
∑
ℓ
=
1
k
δ
(
i
(
ℓ
)
∈
I
u
t
e
)
=
命中个数
预测序列总个数
=
命中率
\operatorname{Pre}_{u} @ k=\frac{1}{k} \sum_{\ell=1}^{k} \delta\left(i(\ell) \in \mathcal{I}_{u}^{\mathrm{te}}\right)=\frac{命中个数}{预测序列总个数} =命中率
Preu@k=k1ℓ=1∑kδ(i(ℓ)∈Iute)=预测序列总个数命中个数=命中率
其中,当
x
x
x 为真时,
δ
(
x
)
=
1
\delta\left(x\right)=1
δ(x)=1 ,当
x
x
x 为假时,
δ
(
x
)
=
0
\delta\left(x\right)=0
δ(x)=0 ;
∑ ℓ = 1 k δ ( i ( ℓ ) ∈ I u t e ) = ∣ I u r e ∩ I u t e ∣ \sum_{\ell=1}^{k} \delta\left(i(\ell) \in \mathcal{I}_{u}^{t e}\right)=\left|\mathcal{I}_{u}^{r e} \cap \mathcal{I}_{u}^{t e}\right| ∑ℓ=1kδ(i(ℓ)∈Iute)=∣Iure∩Iute∣ 表示既属于 I u r e \mathcal{I}_{u}^{r e} Iure 又属于 I u t e \mathcal{I}_{u}^{t e} Iute 的项目数, k k k 是预测序列的个数 ∣ I u r e ∣ |\mathcal{I}_{u}^{r e}| ∣Iure∣。
所以总精确度可以这样计算:
Pre@k
=
∑
u
∈
U
te
Pre
u
@
k
/
∣
U
te
∣
\text { Pre@k }=\sum_{u \in \mathcal{U}^{\text {te }}} \operatorname{Pre}_{u} @ k /\left|\mathcal{U}^{\text {te }}\right|
Pre@k =u∈Ute ∑Preu@k/∣
∣Ute ∣
∣
注:实际就是每个用户的精确度求和再除以用户数。
用户
u
u
u 的召回率定义如下:
Rec
u
@
k
=
1
∣
I
u
t
e
∣
∑
ℓ
=
1
k
δ
(
i
(
ℓ
)
∈
I
u
t
e
)
=
命中个数
测试集项目数
=
召回率
\operatorname{Rec}_{u} @ k=\frac{1}{|\mathcal{I}_{u}^{\mathrm{te}}|} \sum_{\ell=1}^{k} \delta\left(i(\ell) \in \mathcal{I}_{u}^{\mathrm{te}}\right)=\frac{命中个数}{测试集项目数} =召回率
Recu@k=∣Iute∣1ℓ=1∑kδ(i(ℓ)∈Iute)=测试集项目数命中个数=召回率
这表示有多少在
I
u
t
e
\mathcal{I}_{u}^{\mathrm{te}}
Iute 中的项目也在
I
u
r
e
\mathcal{I}_{u}^{\mathrm{re}}
Iure 中。
因此,总的召回率计算公式如下:
Rec@k
=
∑
u
∈
U
te
Rec
u
@
k
/
∣
U
te
∣
\text { Rec@k }=\sum_{u \in \mathcal{U}^{\text {te }}} \operatorname{Rec}_{u} @ k /\left|\mathcal{U}^{\text {te }}\right|
Rec@k =u∈Ute ∑Recu@k/∣
∣Ute ∣
∣
4.4 结果
PopRank和基于记忆的OCCF的预测性能 (Jaccard 指标, K = 50)上的MovieLens100K (u1.base;OCCF u1.test.OCCF)。
观察到,混合方法性能较好,符合预期。
4.5 结论
- 三个主要部分
- 相似度计算方法以及相关技术
- 邻居选择
- 预测规则