基于内容的推荐算法
这个问题的假设是,我们知道我们推荐的内容有若干特征值 x ( i ) x^{(i)} x(i),且我们也同时知道用户对一些内容的喜欢程度 y ( i ) y^{(i)} y(i),我们要做的就是预测用户对他/她没有看过的内容的喜欢程度。所以对于单个用户这就是个线性回归问题,对于用户群体这就是多个线性回归问题叠加。
假设用户数为
n
u
n_u
nu,内容数
n
m
n_m
nm,当用户看过该内容时
r
(
i
,
j
)
=
1
r(i,j)=1
r(i,j)=1,
y
(
i
,
j
)
y^{(i,j)}
y(i,j)表示用户
j
j
j对内容
i
i
i的喜爱程度,
θ
(
j
)
\theta^{(j)}
θ(j)为
j
j
j用户的参数向量,
x
(
i
)
x^{(i)}
x(i)为
i
i
i电影的特征值向量。则对单个用户来说,我们要最小化的代价函数就是
1
2
∑
i
:
r
(
i
,
j
)
=
1
(
(
θ
(
j
)
)
T
x
(
i
)
−
y
(
i
,
j
)
)
2
+
λ
2
∑
k
=
1
n
(
θ
k
(
j
)
)
2
\frac{1}{2}\sum_{i:r(i,j)=1}\left((\theta^{(j)})^Tx^{(i)}-y^{(i,j)}\right)^2+\frac{\lambda}{2}\sum_{k=1}^n(\theta_k^{(j)})^2
21i:r(i,j)=1∑((θ(j))Tx(i)−y(i,j))2+2λk=1∑n(θk(j))2
对于用户群体就是再累加一层:
1
2
∑
j
=
1
n
u
∑
i
:
r
(
i
,
j
)
=
1
(
(
θ
(
j
)
)
T
x
(
i
)
−
y
(
i
,
j
)
)
2
+
λ
2
∑
j
=
1
n
u
∑
k
=
1
n
(
θ
k
(
j
)
)
2
\frac{1}{2}\sum_{j=1}^{n_u}\sum_{i:r(i,j)=1}\left((\theta^{(j)})^Tx^{(i)}-y^{(i,j)}\right)^2+\frac{\lambda}{2}\sum_{j=1}^{n_u}\sum_{k=1}^n(\theta_k^{(j)})^2
21j=1∑nui:r(i,j)=1∑((θ(j))Tx(i)−y(i,j))2+2λj=1∑nuk=1∑n(θk(j))2
而梯度则是
∂
∂
θ
k
(
j
)
J
(
θ
(
1
)
,
⋯
,
θ
(
n
u
)
)
=
{
∑
i
:
r
(
i
,
j
)
=
1
(
(
θ
(
j
)
)
T
x
(
i
)
−
y
(
i
,
j
)
)
x
k
(
i
)
,
k
=
0
∑
i
:
r
(
i
,
j
)
=
1
(
(
θ
(
j
)
)
T
x
(
i
)
−
y
(
i
,
j
)
)
x
k
(
i
)
+
λ
θ
k
(
j
)
,
k
≠
0
\frac{\partial}{\partial \theta_k^{(j)}}J(\theta^{(1)},\cdots,\theta^{(n_u)})=\left\{ \begin{aligned} &\sum_{i:r(i,j)=1}\left((\theta^{(j)})^Tx^{(i)}-y^{(i,j)}\right)x_k^{(i)}&&,k=0 \\ &\sum_{i:r(i,j)=1}\left((\theta^{(j)})^Tx^{(i)}-y^{(i,j)}\right)x_k^{(i)}+\lambda\theta_k^{(j)}&&,k\not=0 \end{aligned}\right.
∂θk(j)∂J(θ(1),⋯,θ(nu))=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧i:r(i,j)=1∑((θ(j))Tx(i)−y(i,j))xk(i)i:r(i,j)=1∑((θ(j))Tx(i)−y(i,j))xk(i)+λθk(j),k=0,k=0
跟线性回归约等于同一个算法。
协同过滤
通常而言,内容的特征值向量并不是那么好得到,尤其是得到一系列具体的数字。如果用户的喜好更容易调查出一点,我们反而可以靠用户的喜好来求解内容的特征值。所以,假设我们已知
y
(
i
,
j
)
y^{(i,j)}
y(i,j)与
θ
(
j
)
\theta^{(j)}
θ(j),不知道
x
(
i
)
x^{(i)}
x(i),问题就变成寻找最可能的
x
(
i
)
x^{(i)}
x(i)值使得
(
θ
(
j
)
)
T
x
(
i
)
=
y
(
i
,
j
)
(\theta^{(j)})^Tx^{(i)}=y^{(i,j)}
(θ(j))Tx(i)=y(i,j),相当于参数与特征值的地位交换了,变成已知参数求特征值。所以代价函数变为
1
2
∑
i
=
1
n
m
∑
j
:
r
(
i
,
j
)
=
1
(
(
θ
(
j
)
)
T
x
(
i
)
−
y
(
i
,
j
)
)
2
+
λ
2
∑
i
=
1
n
m
∑
k
=
1
n
(
x
k
(
i
)
)
2
\frac{1}{2}\sum_{i=1}^{n_m}\sum_{j:r(i,j)=1}\left((\theta^{(j)})^Tx^{(i)}-y^{(i,j)}\right)^2+\frac{\lambda}{2}\sum_{i=1}^{n_m}\sum_{k=1}^n(x_k^{(i)})^2
21i=1∑nmj:r(i,j)=1∑((θ(j))Tx(i)−y(i,j))2+2λi=1∑nmk=1∑n(xk(i))2
梯度变为
{
∑
j
:
r
(
i
,
j
)
=
1
(
(
θ
(
j
)
)
T
x
(
i
)
−
y
(
i
,
j
)
)
θ
k
(
j
)
,
k
=
0
∑
j
:
r
(
i
,
j
)
=
1
(
(
θ
(
j
)
)
T
x
(
i
)
−
y
(
i
,
j
)
)
θ
k
(
j
)
+
λ
x
k
(
i
)
,
k
≠
0
\left\{ \begin{aligned} &\sum_{j:r(i,j)=1}\left((\theta^{(j)})^Tx^{(i)}-y^{(i,j)}\right)\theta_k^{(j)}&&,k=0 \\ &\sum_{j:r(i,j)=1}\left((\theta^{(j)})^Tx^{(i)}-y^{(i,j)}\right)\theta_k^{(j)}+\lambda x_k^{(i)}&&,k\not=0 \end{aligned}\right.
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧j:r(i,j)=1∑((θ(j))Tx(i)−y(i,j))θk(j)j:r(i,j)=1∑((θ(j))Tx(i)−y(i,j))θk(j)+λxk(i),k=0,k=0
这样我们就有了已知
θ
\theta
θ求
x
x
x的手段,结合基于内容的推荐算法,我们就可以依靠
θ
\theta
θ推导
x
x
x,再通过
x
x
x修正
θ
\theta
θ……如此循环就能得到一个合理的推送结果。这实际上是借助用户的行为对内容进行评估,而评估的内容又能使得推送更加精确,集合每位用户的数据来优化推送,所以这个算法称之为协同过滤。
不过,我们实际上没必要循环地计算
θ
\theta
θ和
x
x
x,我们可以同时计算他们俩,让我们合并两个代价函数,得到
1
2
∑
(
i
,
j
)
:
r
(
i
,
j
)
=
1
(
(
θ
(
j
)
)
T
x
(
i
)
−
y
(
i
,
j
)
)
2
+
λ
2
∑
j
=
1
n
u
∑
k
=
1
n
(
θ
k
(
j
)
)
2
+
λ
2
∑
i
=
1
n
m
∑
k
=
1
n
(
x
k
(
i
)
)
2
\frac{1}{2}\sum_{(i,j):r(i,j)=1}\left((\theta^{(j)})^Tx^{(i)}-y^{(i,j)}\right)^2+\frac{\lambda}{2}\sum_{j=1}^{n_u}\sum_{k=1}^n(\theta_k^{(j)})^2+\frac{\lambda}{2}\sum_{i=1}^{n_m}\sum_{k=1}^n(x_k^{(i)})^2
21(i,j):r(i,j)=1∑((θ(j))Tx(i)−y(i,j))2+2λj=1∑nuk=1∑n(θk(j))2+2λi=1∑nmk=1∑n(xk(i))2
同时我们不再定义截距
θ
0
\theta_0
θ0,相应地
x
0
x_0
x0也失去了意义,因为我们要同时优化这两个值,不需要使其恒等于一个值。
新的梯度为
∂
∂
θ
k
(
j
)
J
(
θ
(
1
)
,
⋯
,
θ
(
n
u
)
,
x
(
1
)
,
⋯
,
x
(
n
m
)
)
=
∑
i
:
r
(
i
,
j
)
=
1
(
(
θ
(
j
)
)
T
x
(
i
)
−
y
(
i
,
j
)
)
x
k
(
i
)
+
λ
θ
k
(
j
)
∂
∂
x
k
(
i
)
J
(
θ
(
1
)
,
⋯
,
θ
(
n
u
)
,
x
(
1
)
,
⋯
,
x
(
n
m
)
)
=
∑
j
:
r
(
i
,
j
)
=
1
(
(
θ
(
j
)
)
T
x
(
i
)
−
y
(
i
,
j
)
)
θ
k
(
j
)
+
λ
x
k
(
i
)
\begin{aligned} &\frac{\partial}{\partial \theta_k^{(j)}}J(\theta^{(1)},\cdots,\theta^{(n_u)},x^{(1)},\cdots,x^{(n_m)})=\sum_{i:r(i,j)=1}\left((\theta^{(j)})^Tx^{(i)}-y^{(i,j)}\right)x_k^{(i)}+\lambda\theta_k^{(j)}\\ &\frac{\partial}{\partial x_k^{(i)}}J(\theta^{(1)},\cdots,\theta^{(n_u)},x^{(1)},\cdots,x^{(n_m)})=\sum_{j:r(i,j)=1}\left((\theta^{(j)})^Tx^{(i)}-y^{(i,j)}\right)\theta_k^{(j)}+\lambda x_k^{(i)} \end{aligned}
∂θk(j)∂J(θ(1),⋯,θ(nu),x(1),⋯,x(nm))=i:r(i,j)=1∑((θ(j))Tx(i)−y(i,j))xk(i)+λθk(j)∂xk(i)∂J(θ(1),⋯,θ(nu),x(1),⋯,x(nm))=j:r(i,j)=1∑((θ(j))Tx(i)−y(i,j))θk(j)+λxk(i)
一般,我们对
θ
\theta
θ和
x
x
x进行随机初始化,这步跟神经网络比较相似,避免一些对称化的情况出现。
这样我们就得到了完整的协同过滤算法,已知量只有用户对内容的喜好程度 y ( i , j ) y^{(i,j)} y(i,j),这也更接近现实中的情况。
要向量化协同过滤,可以令
X
=
[
−
(
x
(
1
)
)
T
−
−
(
x
(
2
)
)
T
−
⋮
−
(
x
(
n
m
)
)
T
−
]
,
Θ
=
[
−
(
θ
(
1
)
)
T
−
−
(
θ
(
2
)
)
T
−
⋮
−
(
θ
(
n
u
)
)
T
−
]
X=\left[\begin{matrix} -(x^{(1)})^T-\\ -(x^{(2)})^T-\\ \vdots\\ -(x^{(n_m)})^T-\\ \end{matrix}\right], \Theta=\left[\begin{matrix} -(\theta^{(1)})^T-\\ -(\theta^{(2)})^T-\\ \vdots\\ -(\theta^{(n_u)})^T-\\ \end{matrix}\right]
X=⎣⎢⎢⎢⎡−(x(1))T−−(x(2))T−⋮−(x(nm))T−⎦⎥⎥⎥⎤,Θ=⎣⎢⎢⎢⎡−(θ(1))T−−(θ(2))T−⋮−(θ(nu))T−⎦⎥⎥⎥⎤
那么我们的预测值矩阵就可写作
H
θ
=
X
Θ
T
H_\theta=X\Theta^T
Hθ=XΘT
相似推荐
得到内容的特征值向量 x ( i ) x^{(i)} x(i)后,要推荐相似内容就很简单了,我们只需要寻找两个特征值向量比较接近,如 ∣ ∣ x ( i ) − x ( j ) ∣ ∣ ||x^{(i)}-x^{(j)}|| ∣∣x(i)−x(j)∣∣较小的内容。
均值归一化
均值归一化对于我们完全不知道其喜好的用户比较有用,对于一个我们完全不知道喜好的用户,他/她的 r ( i , j ) r(i,j) r(i,j)全都是0,因此代价函数里只剩两个正则项,而 x x x的正则项由我们掌握的内容信息决定,影响最大的就是 θ \theta θ的正则项。所以,为了最小化代价函数,算法会将该用户的喜好参数 θ \theta θ全部设定为0,由此我们预测的喜好程度 θ T x \theta^Tx θTx也会是0,这样我们得到的结果就是该用户对任何内容都特别不喜欢,让推荐算法束手无策。
但如果我们应用了均值归一化( y : = y − μ σ y:=\frac{y-\mu}{\sigma} y:=σy−μ),所有喜好程度 y y y被均值归一化后均值都变成0,这样即使我们预测出的喜好程度都是0,再复原均值归一化( y : = y × σ + μ y:=y\times\sigma+\mu y:=y×σ+μ)的时候,预测值就会变成 μ \mu μ,即所有用户喜好的平均值,这对于一个我们完全不知道喜好的用户来说就是合理的了。