slope One Predictors for Online Rating-Based Collaborative Filtering阅读笔记
1. related work
**memory–Based **: 找到相似的物品(用户), 使用这些相似的用户(物品), 来预测未知的打分, 具体的预测策略有根据相似度进行加权预测.
缺点:
- 对于可拓展性以及数据的稀疏性非常敏感
- 对于需要快速在线查询无法进行预计算
- 计算相似性一般是要找到满足某个数量的用户(物品)
Model-Based Scheme:
- 通常比memory-Based算法的实时性好
三种方案:
- f ( x ) = x + b f(x) = x + b f(x)=x+b: 本文使用的方案, x是变量, 表示打分, b是一个常量用于修正打分
- f ( x ) = x f(x) = x f(x)=x: 同上
- f ( x ) = a x + b f(x) = ax + b f(x)=ax+b: 线性规划预测打分
- f ( x ) = a x 2 + b x + c f(x) = ax^2 + bx + c f(x)=ax2+bx+c: 多项式拟合
2. CF Algorithm
2.1 符号定义
u u u: 一个序列, 但是这个序列当中有缺失值, 这个序列表示用户对所有物品的打分, 缺失值是表示用户并没有对这个用户打分, u i u_i ui表示用对物品 i i i的打分
S ( u ) S(u) S(u): u u u的子集, 表示打过分的那部分元素的集合
χ \chi χ: 表示所有 u u u的集合
c a r d ( S ) card(S) card(S): 表示集合 S S S的大小
u ˉ \bar u uˉ: 集合 u u u的平均打分
S i ( χ S_i(\chi Si(χ): 给物品 i i i打过分的所有 u u u的集合
⟨ u , v ⟩ \langle u, v \rangle ⟨u,v⟩: ∑ i ∈ S ( u ) ∩ S ( v ) u i v i \sum_{i \in S(u) \cap S(v)} u_i v_i ∑i∈S(u)∩S(v)uivi
P ( u ) P(u) P(u): 表示对于用户 u u u, 所有的预测的值
2.2 Baseline Schemes
PER USER AVERAGE
P
(
u
)
=
u
ˉ
P(u) = \bar u
P(u)=uˉ
BIAS FROM MEAN
P
(
u
)
i
=
u
ˉ
+
1
c
a
r
d
(
S
i
(
χ
)
)
∑
v
∈
S
i
(
χ
)
v
i
−
v
ˉ
P(u)_i = \bar u + \frac{1}{card(S_i(\chi))} \sum_{v \in S_i(\chi)} v_i - \bar v
P(u)i=uˉ+card(Si(χ))1v∈Si(χ)∑vi−vˉ
简单来说就是一个用户对所有物品的平均打分再加上所有用户对物品i的打分和其他物品打分的的均值差的均值
其他文献提到的item-based approach, 对于两个物品
i
,
j
i, j
i,j的相似度的计算
s
i
m
i
,
j
=
∑
u
∈
S
i
,
j
(
χ
)
(
u
i
−
u
ˉ
)
(
u
j
−
u
ˉ
)
∑
u
∈
S
i
,
j
(
χ
)
(
u
i
−
u
ˉ
)
2
∑
u
∈
S
i
,
j
(
χ
)
(
u
j
−
u
ˉ
)
2
sim_{i,j} = \frac{\sum_{u \in S_{i, j}(\chi)}(u_i - \bar u)(u_j -\bar u) }{\sum_{u \in S_{i, j}(\chi)}(u_i - \bar u)^2 \sum_{u \in S_{i, j}(\chi)}(u_j - \bar u)^2 }
simi,j=∑u∈Si,j(χ)(ui−uˉ)2∑u∈Si,j(χ)(uj−uˉ)2∑u∈Si,j(χ)(ui−uˉ)(uj−uˉ)
计算得到相似度之后, 对用线性回归预测的打分结果进行加权平均, 线性回归是用用户
u
u
u对其他物品的打分, 使用线性回归对未知打分进行预测, 由于一个用户可能给多个物品打过分, 所以将结果进行加权平均
P
(
u
)
i
=
∑
j
∈
S
(
u
)
∣
s
i
m
i
,
j
∣
∗
(
α
i
,
j
u
j
+
β
i
,
j
)
∑
j
∈
S
(
u
)
∣
s
i
m
i
,
j
∣
P(u)_i = \frac{\sum_{j \in S(u)}|sim_{i,j}| * (\alpha_{i, j}u_j + \beta_{i, j})}{\sum_{j \in S(u)}|sim_{i, j}|}
P(u)i=∑j∈S(u)∣simi,j∣∑j∈S(u)∣simi,j∣∗(αi,juj+βi,j)
例如用户u对物品2, 4, 8进行了打分, 现在对物品1进行预测 ,任意两个物品之间有一个线性回归的式子可以计算通过1个物品对另外一个物品的打分情况, 所以我们使用线性回归分别计算出基于物品2, 4. 8下, 用户 u u u对物品1的三个打分, 这三个打分, 在通过物品2, 4,8对物品1的相似度加权平均, 最终得到最后的打分
2.3 Pearson Reference Scheme
Pearson Scheme是当时准确率最高的memory based方案
P
(
u
)
i
=
u
ˉ
+
∑
v
∈
S
i
(
χ
)
γ
(
u
,
v
)
(
v
i
−
v
ˉ
)
∑
v
∈
S
i
(
χ
)
∣
γ
(
u
,
v
)
∣
P(u)_i = \bar u + \frac{\sum_{v \in S_i(\chi)} \gamma(u, v)(v_i - \bar v)}{\sum_{v \in S_i(\chi)}|\gamma(u, v)|}
P(u)i=uˉ+∑v∈Si(χ)∣γ(u,v)∣∑v∈Si(χ)γ(u,v)(vi−vˉ)
γ
\gamma
γ是基于皮尔逊相关系数计算得到的相似度(感觉这里是计算的用户相似度)
C
o
r
r
(
u
,
w
)
=
⟨
u
−
u
ˉ
,
w
−
w
ˉ
⟩
∑
i
∈
S
(
u
)
∩
S
(
w
)
(
u
i
−
u
ˉ
)
2
∑
i
∈
S
(
u
)
∩
S
(
w
)
(
w
i
−
w
ˉ
)
2
Corr(u, w) = \frac{\langle u-\bar u, w-\bar w \rangle}{\sqrt{\sum_{i\in{S(u) \cap S(w)}}(u_i - \bar u)^2 \sum_{i\in{S(u) \cap S(w)}}(w_i - \bar w)^2}}
Corr(u,w)=∑i∈S(u)∩S(w)(ui−uˉ)2∑i∈S(u)∩S(w)(wi−wˉ)2⟨u−uˉ,w−wˉ⟩
γ ( u , w ) = C o r r ( u , w ) ∣ C o r r ( u , w ) ∣ ρ − 1 \gamma(u, w) = Corr(u, w) |Corr(u, w)|^{\rho - 1} γ(u,w)=Corr(u,w)∣Corr(u,w)∣ρ−1
这里设 ρ \rho ρ为2.5
这个方法的基本思想可能是, 给用户u的平均打分加上一个修正, 而这个修正是通过计算其他用户对物品i的打分与平均打分的误差得到的, 把所有用户对i的打分与平均打分的误差基于用户u与其他用户的相似度进行加权得到用户u对物品的打分
2.4 The SLope One Scheme
Slope One算法的核心思想
假定待求的predictor的形式是
f
(
x
)
=
x
+
b
f(x) = x + b
f(x)=x+b, 假设我们有两个序列
v
.
w
v. w
v.w, 是两个用户的打分序列. 假设不同的人之间的打分差异(类似于审美差异)是一个定值, 不管是对什么物品的打分两个人相差的总是一个定值
b
b
b, 基于这个想法, 我们可以根据序列
v
v
v得到一个预测的
w
w
w的打分序列, 我们希望预测的这个序列和真实的序列要尽可能接近, 接近程度我们用二范数表示, 即下面的优化问题
a
r
g
m
i
n
b
∑
i
(
v
i
+
b
−
w
i
)
2
argmin_b \sum_i(v_i + b - w_i)^2
argminbi∑(vi+b−wi)2
凸函数, 直接求导得到最小值点
b
=
∑
i
w
i
−
v
i
n
\begin{equation*} b = \frac{\sum_i w_i - v_i}{n} \end{equation*}
b=n∑iwi−vi
从这个式子来看, 这个差异实际上就是两个序列差异的平均值
根据上面的式子, 所有人对于两个物品
i
,
j
i, j
i,j的打分差异总是一个定值, 于是根据上面的分析这个定值为
d
e
v
j
,
i
=
∑
u
∈
S
j
,
i
(
χ
)
u
j
−
u
i
c
a
r
d
(
S
j
,
i
(
χ
)
)
\begin{equation*} dev_{j,i} = \sum_{u \in S_{j, i}(\chi)}\frac{u_j - u_i}{card(S_{j,i}(\chi))} \end{equation*}
devj,i=u∈Sj,i(χ)∑card(Sj,i(χ))uj−ui
其实就是找到同时给物品
j
和
i
j和i
j和i打过分的用户有哪些, 不同用户对
j
,
i
j, i
j,i的打分可以组成两个向量, 计算这两个向量之间的差异的均值就是两个物品之间打分的差异, 这个差异可以存储在一个矩阵当中, 显然这个矩阵是一个对称矩阵, 当有新的物品出现时, 更新矩阵也不是很麻烦, 只需要加一行矩阵即可, 矩阵当中已经有的元素不用动
现在假设我们有物品
j
j
j的打分, 我们要通过物品
j
j
j的打分来预测对物品
i
i
i的打分, 显然就是
d
e
v
j
,
i
+
u
j
\begin{equation*} dev_{j, i} + u_j \end{equation*}
devj,i+uj
根据上面的思想, 我们只需要把物品
j
j
j拓展到改用户所有打过分的其他物品即可
R
j
=
{
i
∣
i
∈
S
(
u
)
,
i
≠
j
,
c
a
r
d
(
S
(
j
,
i
)
(
χ
)
)
>
0
}
\begin{equation*} R_j = \{i| i\in S(u), i\neq j, card(S_{(j,i)}(\chi)) > 0\} \end{equation*}
Rj={i∣i∈S(u),i=j,card(S(j,i)(χ))>0}
注意上面那个大于0的要求, 实际上就是说这两个物品必须得有人同时打过分, 于是预测的打分就是
P
(
u
)
j
1
c
a
r
d
(
R
j
)
∑
i
∈
R
j
(
d
e
v
j
,
i
+
u
i
)
\begin{equation*} P(u)_j\frac{1}{card(R_j)} \sum_{i \in R_j}(dev_{j, i} + u_i) \end{equation*}
P(u)jcard(Rj)1i∈Rj∑(devj,i+ui)
这个式子当数据集是稠密的时候可以简化
- 因为数据集是稠密的所以有, d e v j , i dev_{j, i} devj,i矩阵是一个完整的矩阵, 没有缺失值
- 而 R j R_j Rj集合和 S ( u ) S(u) S(u)集合之间就相差一个元素即 j j j, 所以有
u ˉ = ∑ i ∈ S ( u ) u i c a r d ( S ( u ) ) ≈ ∑ i ∈ R j u i c a r d ( R j ) \begin{equation*} \bar u = \sum_{i \in S(u)} \frac{u_i}{card(S(u))} \approx \sum_{i \in R_j}\frac{u_i}{card(R_j)} \end{equation*} uˉ=i∈S(u)∑card(S(u))ui≈i∈Rj∑card(Rj)ui
上面的式子可以简化为
P
S
L
(
u
)
j
=
u
ˉ
+
1
c
a
r
d
(
R
j
)
∑
i
∈
R
j
d
e
v
j
,
i
\begin{equation*} P^{SL}(u)_j = \bar u + \frac{1}{card(R_j)}\sum_{i\in R_j}dev_{j,i} \end{equation*}
PSL(u)j=uˉ+card(Rj)1i∈Rj∑devj,i
2.5 Weighted Slope One Scheme
普通的Slope One Scheme忽视了打分数目的影响, 举个例子
我们要预测物品 J J J的打分, 同时看过 J J J和物品 K K K的用户有2000个人, 同时看过 J J J和 L L L的用户只有20个, 如此一来从直观上来说通过 d e v j , k dev_{j,k} devj,k计算得到的 J J J的打分可信度要比通过 d e v J , L dev_{J,L} devJ,L计算得到的打分要可靠的多, 但是我们只是将这两者简单的进行一个平均, 如此一来就忽略了打分数目对预测的影响
因此有了下面的加权的算法
P
w
S
l
(
u
)
j
=
∑
i
∈
S
(
u
)
−
{
j
}
(
d
e
v
j
,
i
+
u
i
)
c
j
,
i
∑
i
∈
S
(
u
)
−
{
j
}
C
j
,
i
\begin{equation*} P^{wSl}(u)_j = \frac{\sum_{i\in S(u) - \{j\}}(dev_{j,i} + u_i)c_{j,i}}{\sum_{i \in S(u) - \{j\}}C_{j,i}} \end{equation*}
PwSl(u)j=∑i∈S(u)−{j}Cj,i∑i∈S(u)−{j}(devj,i+ui)cj,i
C
j
,
i
=
c
a
r
d
(
S
j
,
i
(
χ
)
)
C_{j,i} = card(S_{j,i}(\chi))
Cj,i=card(Sj,i(χ))实际上就是做了一个打分数目的加权
2.6 The Bi-Polar Slope One Scheme
这种方法实际上是把用户分成了两类, 一类是对于某个物品i喜欢的人群, 一类是对于某个物品i不喜欢的人群. 为了平衡两类人群的数量, 将对于某个物品i的平均打分作为一个阈值来区分两类人群,
最直接的想法就是只考虑喜欢这个物品的打分的人的 d e v j , i dev_{j,i} devj,i, 但是这样原则问题, 会减少可用的数据, 数据量直接变成了之前的一半
首先划分两个集合
S
l
i
k
e
(
u
)
=
{
i
∈
S
(
u
)
∣
u
i
>
u
‾
}
S
d
i
s
l
i
k
e
(
u
)
=
{
i
∈
S
(
u
)
∣
u
i
<
u
‾
}
S
i
,
j
l
i
k
e
=
{
u
∈
χ
∣
i
,
j
∈
S
l
i
k
e
(
u
)
}
S
i
,
j
d
i
s
l
i
k
e
=
{
u
∈
χ
∣
i
,
j
∈
S
d
i
s
l
i
k
e
(
u
)
}
\begin{align*} S^{like}(u) &= \{i \in S(u) \mid u_i > \overline{u}\} \\ S^{dislike}(u) &= \{i \in S(u) \mid u_i < \overline{u}\} \\ S^{like}_{i,j}&=\{u\in \chi \mid i,j\in S^{like}(u)\} \qquad\qquad \\ S^{dislike}_{i,j}&=\{u \in \chi \mid i,j \in S^{dislike}(u)\} \qquad\qquad \end{align*}
Slike(u)Sdislike(u)Si,jlikeSi,jdislike={i∈S(u)∣ui>u}={i∈S(u)∣ui<u}={u∈χ∣i,j∈Slike(u)}={u∈χ∣i,j∈Sdislike(u)}
有了这两个集合, 就可以计算两个derivation矩阵
d
e
v
j
,
i
l
i
k
e
=
∑
u
∈
S
j
,
i
l
i
k
e
(
χ
)
u
j
−
u
i
c
a
r
d
‾
(
S
j
,
i
l
i
k
e
(
χ
)
)
d
e
v
j
,
i
d
i
s
l
i
k
e
=
∑
u
∈
S
j
,
i
d
i
s
l
i
k
e
(
χ
)
u
j
−
u
i
c
a
r
d
‾
(
S
j
,
i
d
i
s
l
i
k
e
(
χ
)
)
\begin{align*} dev^{like}_{j,i} &= \sum_{ u \in S^{like}_{j,i}(\chi)} \frac {u_j-u_i}{car\underline d(S^{like}_{j,i}( \chi))} \qquad\qquad \\ dev^{dislike}_{j,i} &= \sum_{ u \in S^{dislike}_{j,i}(\chi)} \frac {u_j-u_i}{car\underline d(S^{dislike}_{j,i}( \chi))} \qquad\qquad \end{align*}
devj,ilikedevj,idislike=u∈Sj,ilike(χ)∑card(Sj,ilike(χ))uj−ui=u∈Sj,idislike(χ)∑card(Sj,idislike(χ))uj−ui
预测打分有两种
{
d
e
v
j
,
i
l
i
k
e
+
u
i
,
u
i
>
u
‾
d
e
v
j
,
i
d
i
s
l
i
k
e
+
u
i
,
u
i
<
u
‾
\begin{cases} dev^{like}_{j,i} + u_i , & \text{$u_i > \overline u$} \\ dev^{dislike}_{j,i} + u_i , & \text{$u_i < \overline u$} \end{cases}
{devj,ilike+ui,devj,idislike+ui,ui>uui<u
把两个打分结合起来
P
b
p
S
l
(
u
)
j
=
∑
i
∈
S
l
i
k
e
(
u
)
−
{
j
}
p
j
,
i
l
i
k
e
c
j
,
i
l
i
k
e
+
∑
i
∈
S
d
i
s
l
i
k
e
(
u
)
−
{
j
}
p
j
,
i
d
i
s
l
i
k
e
c
j
,
i
d
i
s
l
i
k
e
∑
i
∈
S
l
i
k
e
(
u
)
−
{
j
}
c
j
,
i
l
i
k
e
+
∑
i
∈
S
d
i
s
l
i
k
e
(
u
)
−
{
j
}
c
j
,
i
d
i
s
l
i
k
e
\begin{equation*} P^{bpSl}(u)_j = \frac {\sum_{i \in S^{like}(u)-\{j\}}p_{j,i}^{like} c_{j,i}^{like} + \sum_{i \in S^{dislike}(u)-\{j\}} p_{j,i}^{dislike}c_{j,i}^{dislike}} {\sum_{i \in S^{like}(u)-\{j\}}c_{j,i}^{like} + \sum_{i \in S^{dislike}(u)-\{j\}}c_{j,i}^{dislike}} \qquad\qquad \end{equation*}
PbpSl(u)j=∑i∈Slike(u)−{j}cj,ilike+∑i∈Sdislike(u)−{j}cj,idislike∑i∈Slike(u)−{j}pj,ilikecj,ilike+∑i∈Sdislike(u)−{j}pj,idislikecj,idislike
3. Experimental Result
评估方法: 留一法交叉验证
评估指标: MAE
数据集:EachMovie dataset, MovieLens
具体参数设置: 略, 见原文
效果还不错比Pearson方法相差不了多少