1. 基于内容的推荐算法
推荐算法主要的目的就是根据已有信息找出一些未知的信息,比如根据用户以往的观影记录推荐其可能喜欢的。下图表示若干用户对不同电影的评分,其中包含一部分
?
?
? 表示用户没有对对应的电影评分,我们正是希望通过推荐算法将下图
?
?
? 位置表示的用户评分计算出来。
为了计算未知数据,如下图所示,根据每个电影的特点建立特征向量
x
(
i
)
=
[
x
0
x
1
x
2
]
x^{(i)}=\left[\begin{matrix}x_0 \\ x_1 \\ x_2\end{matrix}\right]
x(i)=⎣⎡x0x1x2⎦⎤(其中
x
0
=
1
x_0=1
x0=1),之后根据每个用户的信息,为每个用户构建一个维度与
x
x
x 相同的参数向量
θ
(
j
)
\theta^{(j)}
θ(j),那么用户
j
j
j 对电影
i
i
i 的评分就可以记为
(
θ
(
j
)
)
T
x
(
i
)
(\theta^{(j)})^Tx^{(i)}
(θ(j))Tx(i)。
对于电影的特征向量,我们可以根据电影的信息构建,所以是已知的信息。而
θ
(
j
)
\theta^{(j)}
θ(j) 需要根据用户的历史评价来计算,所以主要目标就是构建用户的参数向量。
这里我们首先对其中的参数表示进行定义:
- n u n_u nu 表示用户个数
- n m n_m nm 表示电影的个数
- r ( i , j ) = 1 r(i,j)=1 r(i,j)=1 表示用户 j j j 对电影 i i i 进行了评分
- y ( i , j ) y^{(i,j)} y(i,j) 表示用户 j j j 对电影 i i i 的评分
- θ ( j ) \theta^{(j)} θ(j) 用户 j j j 的参数向量,有 n n n 个特征的电影, θ ( j ) ∈ R n + 1 \theta^{(j)}\in \mathbb{R}^{n+1} θ(j)∈Rn+1, θ 0 \theta_0 θ0 为偏置项
- x ( i ) x^{(i)} x(i) 电影 i i i 的特征向量,对于 n n n 个特征的电影, x ( i ) ∈ R n + 1 x^{(i)}\in \mathbb{R}^{n+1} x(i)∈Rn+1,其中 x 0 = 1 x_0=1 x0=1
- m ( j ) m^{(j)} m(j) 表示用户 j j j 已经评价的电影个数
为了求解
θ
(
j
)
\theta^{(j)}
θ(j) 中的参数,我们可以构建如下的代价函数:
min
θ
(
j
)
1
2
∑
i
:
r
(
i
,
j
)
=
1
[
(
θ
(
j
)
)
T
x
(
i
)
−
y
(
i
,
j
)
]
2
+
λ
2
∑
k
=
1
n
[
θ
k
(
j
)
]
2
\min_{\theta^{(j)}} \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\left[\theta_k^{(j)}\right]^2
θ(j)min21i:r(i,j)=1∑[(θ(j))Tx(i)−y(i,j)]2+2λk=1∑n[θk(j)]2
其中 i : r ( i , j ) = 1 i:r(i,j)=1 i:r(i,j)=1 表示用户 j j j 已经评价的所有电影 i i i,后面表示正则项。
对于所有用户的参数向量
θ
(
1
)
,
θ
(
2
)
,
⋯
,
θ
(
n
u
)
\theta^{(1)},\theta^{(2)},\cdots,\theta^{(n_u)}
θ(1),θ(2),⋯,θ(nu),我们将它们所有的代价函数累加,得到如下的代价函数:
min
θ
(
1
)
,
⋯
,
θ
(
n
u
)
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
\min_{\theta^{(1)},\cdots,\theta^{(n_u)}} \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\left[\theta_k^{(j)}\right]^2
θ(1),⋯,θ(nu)min21j=1∑nui:r(i,j)=1∑[(θ(j))Tx(i)−y(i,j)]2+2λj=1∑nuk=1∑n[θk(j)]2
得到代价函数后,我们就可以使用如下梯度更新的方式计算出每个参数的值:
θ
k
(
j
)
=
θ
k
(
j
)
−
α
∑
i
:
r
(
i
,
j
)
=
1
[
(
θ
(
j
)
)
T
x
(
i
)
−
y
(
i
,
j
)
]
x
k
(
i
)
i
f
k
=
0
θ
k
(
j
)
=
θ
k
(
j
)
−
α
{
∑
i
:
r
(
i
,
j
)
=
1
[
(
θ
(
j
)
)
T
x
(
i
)
−
y
(
i
,
j
)
]
x
k
(
i
)
+
λ
θ
k
(
j
)
}
i
f
k
≠
0
\begin{aligned} \theta_k^{(j)} &= \theta_k^{(j)} - \alpha \sum_{i:r(i,j)=1}\left[ (\theta^{(j)})^Tx^{(i)}-y^{(i,j)}\right]x_k^{(i)} &\quad if\ k=0\\ \theta_k^{(j)} &= \theta_k^{(j)} - \alpha \left\{\sum_{i:r(i,j)=1}\left[ (\theta^{(j)})^Tx^{(i)}-y^{(i,j)}\right]x_k^{(i)}+\lambda\theta_k^{(j)} \right\}&\quad if\ k\neq 0\\ \end{aligned}
θk(j)θk(j)=θk(j)−αi:r(i,j)=1∑[(θ(j))Tx(i)−y(i,j)]xk(i)=θk(j)−α⎩⎨⎧i:r(i,j)=1∑[(θ(j))Tx(i)−y(i,j)]xk(i)+λθk(j)⎭⎬⎫if k=0if k=0
这种根据电影的特征做出预测的方法称为 基于内容的推荐算法,算法的关键就算要对电影的特点构建特征向量。但是有时我们很难对要预测的事物构建特征向量,这时基于内容的推荐算法就不能满足要求了。
2. 协同过滤
特征学习,自行学习所需要的特征
在上面的算法过程中,我们需要首先计算出每个电影的特征向量,但是在条件不允许时,我们无法找到电影的特征向量,如下所示:
这时如果我们知道每个人的电影偏好,并构建参数向量 θ \theta θ,那么就能根据每个人的偏好总结出对应电影的特征向量。
如 A 和 B 都喜欢 romance 电影,但是不喜欢 action 类型的电影,对于第一步电影 Love at last,A 和 B 都喜欢,那么就有很大的概率判断该电影属于 romance 电影,所以对应的特征向量就可能为 x ( 1 ) = [ x 1 x 2 ] = [ 1 0 ] x^{(1)}=\left[\begin{matrix}x_1\\ x_2\end{matrix}\right]=\left[\begin{matrix}1 \\ 0\end{matrix}\right] x(1)=[x1x2]=[10]。
这时如果我们知道了用户 A 的参数向量 θ ( 1 ) \theta^{(1)} θ(1),又知道了 A 对电影 Love at last 的评分为 5 5 5,所以只需要找到电影 Love at last 对应的特征向量 x ( 1 ) x^{(1)} x(1),使得 y ( 1 , 1 ) = 5 ≈ ( θ ( 1 ) ) T x ( 1 ) y^{(1,1)}=5\approx (\theta^{(1)})^Tx^{(1)} y(1,1)=5≈(θ(1))Tx(1),依次这样使用每个 θ ( 1 ) , θ ( 2 ) , θ ( 3 ) , ⋯ \theta^{(1)},\theta^{(2)},\theta^{(3)},\cdots θ(1),θ(2),θ(3),⋯ 计算每个 x ( i ) x^{(i)} x(i),使得 y ( i , j ) ≈ ( θ ( j ) ) T x ( i ) y^{(i,j)}\approx (\theta^{(j)})^Tx^{(i)} y(i,j)≈(θ(j))Tx(i),就能求解出每个电影的特征向量,也就能根据特征向量对未知数据进行预测了。
至此我们就得到了根据用户的参数向量
θ
(
1
)
,
⋯
,
θ
(
n
u
)
\theta^{(1)},\cdots,\theta^{(n_u)}
θ(1),⋯,θ(nu) 计算电影的特征向量
x
(
i
)
x^{(i)}
x(i)的方法,我们只需要优化如下的代价函数即可:
min
x
(
i
)
1
2
∑
j
:
r
(
i
,
j
)
=
1
[
(
θ
(
j
)
)
T
x
(
i
)
−
y
(
i
,
j
)
]
2
+
λ
2
∑
k
=
1
n
[
x
k
(
i
)
]
2
\min_{x^{(i)}}\frac{1}{2}\sum_{j:r(i,j)=1}\left[(\theta^{(j)})^Tx^{(i)} -y^{(i,j)}\right]^2 + \frac{\lambda}{2}\sum_{k=1}^{n}\left[x_k^{(i)}\right]^2
x(i)min21j:r(i,j)=1∑[(θ(j))Tx(i)−y(i,j)]2+2λk=1∑n[xk(i)]2
计算所有电影的特征向量
x
(
1
)
,
⋯
,
x
(
n
m
)
x^{(1)},\cdots,x^{(n_m)}
x(1),⋯,x(nm) 可以优化如下的代价函数:
min
x
(
1
)
,
⋯
,
x
(
n
m
)
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
\min_{x^{(1)},\cdots,x^{(n_m)}}\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}\left[x_k^{(i)}\right]^2
x(1),⋯,x(nm)min21i=1∑nmj:r(i,j)=1∑[(θ(j))Tx(i)−y(i,j)]2+2λi=1∑nmk=1∑n[xk(i)]2
综上所述,
- 给定了电影的特征向量 x ( 1 ) , ⋯ , x ( n m ) x^{(1)},\cdots,x^{(n_m)} x(1),⋯,x(nm) 和对应部分电影的评分,我们就能计算出参数向量 θ ( 1 ) , ⋯ , θ ( n u \theta^{(1)},\cdots,\theta^{(n_u} θ(1),⋯,θ(nu
- 给定了参数向量 θ ( 1 ) , ⋯ , θ ( n u \theta^{(1)},\cdots,\theta^{(n_u} θ(1),⋯,θ(nu,我们能够计算出电影特征向量 x ( 1 ) , ⋯ , x ( n m ) x^{(1)},\cdots,x^{(n_m)} x(1),⋯,x(nm)
所以我们就可以首先任意初始化一个参数向量 θ \theta θ,计算特征向量 x x x ,再根据算出的 x x x 计算 θ \theta θ,这样就构成了协同过滤, θ → x → θ → x → θ → x → θ ⋯ \theta \rightarrow x \rightarrow \theta \rightarrow x \rightarrow \theta \rightarrow x \rightarrow \theta \cdots θ→x→θ→x→θ→x→θ⋯,不断重复优化,直到得出 θ \theta θ 和 x x x 的最优解。
协同过滤就是再执行算法时观察大量的用户,根据这些用户的实际行为,协同的得到每个人对电影的评分,只要每位用户都对部分电影做出了评价,那么每个用户都在帮助算法学习更合适的特征,再通过这些特征预测其他用户的评分。
3. 协同过滤算法
给定电影的特征向量
x
(
1
)
,
⋯
,
x
(
n
m
)
x^{(1)},\cdots,x^{(n_m)}
x(1),⋯,x(nm) ,我们可以最小化下式求解
θ
(
1
)
,
θ
(
2
)
,
⋯
,
θ
(
n
u
)
\theta^{(1)},\theta^{(2)},\cdots,\theta^{(n_u)}
θ(1),θ(2),⋯,θ(nu):
min
θ
(
1
)
,
⋯
,
θ
(
n
u
)
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
\min_{\theta^{(1)},\cdots,\theta^{(n_u)}} \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\left[\theta_k^{(j)}\right]^2
θ(1),⋯,θ(nu)min21j=1∑nui:r(i,j)=1∑[(θ(j))Tx(i)−y(i,j)]2+2λj=1∑nuk=1∑n[θk(j)]2
而如果给定了特征
θ
(
1
)
,
θ
(
2
)
,
⋯
,
θ
(
n
u
)
\theta^{(1)},\theta^{(2)},\cdots,\theta^{(n_u)}
θ(1),θ(2),⋯,θ(nu),我们可以最小化下式求解
x
(
1
)
,
⋯
,
x
(
n
m
)
x^{(1)},\cdots,x^{(n_m)}
x(1),⋯,x(nm):
min
x
(
1
)
,
⋯
,
x
(
n
m
)
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
\min_{x^{(1)},\cdots,x^{(n_m)}}\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}\left[x_k^{(i)}\right]^2
x(1),⋯,x(nm)min21i=1∑nmj:r(i,j)=1∑[(θ(j))Tx(i)−y(i,j)]2+2λi=1∑nmk=1∑n[xk(i)]2
协同过滤算法将以上两个式子结合为一个式子,这样就不需要循环求解,如下所示:
min
x
(
1
)
,
⋯
,
x
(
n
m
)
θ
(
1
)
,
⋯
,
θ
(
n
u
)
J
(
x
(
1
)
,
⋯
,
x
(
n
m
)
,
θ
(
1
)
,
⋯
,
θ
(
n
u
)
)
=
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
\begin{aligned} &\min_{x^{(1)},\cdots,x^{(n_m)} \atop \theta^{(1)},\cdots,\theta^{(n_u)}} J(x^{(1)},\cdots,x^{(n_m)} , \theta^{(1)},\cdots,\theta^{(n_u)}) \\ =&\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\left[\theta_k^{(j)}\right]^2+ \frac{\lambda}{2}\sum_{i=1}^{n_m}\sum_{k=1}^{n}\left[x_k^{(i)}\right]^2 \end{aligned}
=θ(1),⋯,θ(nu)x(1),⋯,x(nm)minJ(x(1),⋯,x(nm),θ(1),⋯,θ(nu))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
式子中的第一项是上面两个式子第一项的结合,后面两项分别表示对应的惩罚项。这里有一点不一样的是在我们分别求解 θ \theta θ 与 x x x 时, x ∈ R n + 1 , 、 θ ∈ R n + 1 x\in\mathbb{R}^{n+1},、\theta\in\mathbb{R}^{n+1} x∈Rn+1,、θ∈Rn+1 ,但是在我们联合求解时, x ∈ R n , 、 θ ∈ R n x\in\mathbb{R}^{n},、\theta\in\mathbb{R}^{n} x∈Rn,、θ∈Rn,这是因为我们联合求解时不需要偏置项,算法可以自己学习相关的特征。
综上所述,协同过滤算法的过程如下:
-
用小随机数初始化 x ( 1 ) , ⋯ , x ( n m ) , θ ( 1 ) , ⋯ , θ ( n u ) x^{(1)},\cdots,x^{(n_m)} , \theta^{(1)},\cdots,\theta^{(n_u)} x(1),⋯,x(nm),θ(1),⋯,θ(nu)
-
使用梯度下降算法最小化代价函数 J ( x ( 1 ) , ⋯ , x ( n m ) , θ ( 1 ) , ⋯ , θ ( n u ) ) J(x^{(1)},\cdots,x^{(n_m)} , \theta^{(1)},\cdots,\theta^{(n_u)}) J(x(1),⋯,x(nm),θ(1),⋯,θ(nu)):
x k ( i ) = x k ( i ) − α [ ∑ j : r ( i , j ) = 1 [ ( θ ( j ) ) T x ( i ) − y ( i , j ) ] θ k ( j ) + λ x k ( i ) ] θ k ( i ) = θ k ( i ) − α [ ∑ i : r ( i , j ) = 1 [ ( θ ( j ) ) T x ( i ) − y ( i , j ) ] x k ( j ) + λ θ k ( i ) ] \begin{aligned} x_k^{(i)} = x_k^{(i)} - \alpha\left[ \sum_{j:r(i,j)=1}\left[(\theta^{(j)})^Tx^{(i)}-y^{(i,j)}\right]\theta_k^{(j)}+\lambda x_k^{(i)} \right] \\ \theta_k^{(i)} = \theta_k^{(i)} - \alpha\left[ \sum_{i:r(i,j)=1}\left[(\theta^{(j)})^Tx^{(i)}-y^{(i,j)}\right]x_k^{(j)}+\lambda \theta_k^{(i)} \right] \end{aligned} xk(i)=xk(i)−α⎣⎡j:r(i,j)=1∑[(θ(j))Tx(i)−y(i,j)]θk(j)+λxk(i)⎦⎤θk(i)=θk(i)−α⎣⎡i:r(i,j)=1∑[(θ(j))Tx(i)−y(i,j)]xk(j)+λθk(i)⎦⎤ -
使用 ( θ ( i ) ) T x ( j ) (\theta^{(i)})^Tx^{(j)} (θ(i))Tx(j) 计算用户对电影的评分
4. 协同过滤的向量实现
对于如下的电影评分表,我们可以构建一个矩阵进行表示,
对于
n
u
=
4
n_u=4
nu=4 个用户对
n
m
=
5
n_m=5
nm=5 个电影的评分,我们可以构建一个
n
m
×
n
u
n_m\times n_u
nm×nu 的评分矩阵:
Y
=
[
5
5
0
0
5
?
?
0
?
4
0
?
0
0
5
4
0
0
5
0
]
=
[
(
θ
(
1
)
)
T
x
(
1
)
(
θ
(
2
)
)
T
x
(
1
)
⋯
(
θ
(
n
u
)
)
T
x
(
1
)
(
θ
(
1
)
)
T
x
(
2
)
(
θ
(
2
)
)
T
x
(
2
)
⋯
(
θ
(
n
u
)
)
T
x
(
2
)
⋮
⋮
⋮
⋮
(
θ
(
1
)
)
T
x
(
n
m
)
(
θ
(
2
)
)
T
x
(
n
m
)
⋯
(
θ
(
n
u
)
)
T
x
(
n
m
)
]
Y = \left[\begin{matrix} 5 & 5 & 0 & 0 \\ 5 & ? & ? & 0 \\ ? & 4 & 0 & ? \\ 0 & 0 & 5 & 4 \\ 0 & 0 & 5 & 0 \end{matrix}\right] =\left[\begin{matrix} (\theta^{(1)})^Tx^{(1)} & (\theta^{(2)})^Tx^{(1)} & \cdots & (\theta^{(n_u)})^Tx^{(1)} \\ (\theta^{(1)})^Tx^{(2)} & (\theta^{(2)})^Tx^{(2)} & \cdots & (\theta^{(n_u)})^Tx^{(2)} \\ \vdots & \vdots & \vdots & \vdots \\ (\theta^{(1)})^Tx^{(n_m)} & (\theta^{(2)})^Tx^{(n_m)} & \cdots & (\theta^{(n_u)})^Tx^{(n_m)} \end{matrix}\right]
Y=⎣⎢⎢⎢⎢⎡55?005?4000?05500?40⎦⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎡(θ(1))Tx(1)(θ(1))Tx(2)⋮(θ(1))Tx(nm)(θ(2))Tx(1)(θ(2))Tx(2)⋮(θ(2))Tx(nm)⋯⋯⋮⋯(θ(nu))Tx(1)(θ(nu))Tx(2)⋮(θ(nu))Tx(nm)⎦⎥⎥⎥⎤
其中每个
y
(
i
,
j
)
=
(
θ
(
i
)
)
T
x
(
j
)
y^{(i,j)}=(\theta^{(i)})^Tx^{(j)}
y(i,j)=(θ(i))Tx(j) 表示通过特征向量和权重向量得到的评分值。如果我们将特征向量表示如下,其中
(
x
(
1
)
)
T
(x^{(1)})^T
(x(1))T 表示将列向量转置为行向量:
X
=
[
(
x
(
1
)
)
T
(
x
(
2
)
)
T
⋮
(
x
(
n
m
)
)
T
]
X = \left[\begin{matrix}(x^{(1)})^T \\ (x^{(2)})^T \\ \vdots \\ (x^{(n_m)})^T \end{matrix}\right]
X=⎣⎢⎢⎢⎡(x(1))T(x(2))T⋮(x(nm))T⎦⎥⎥⎥⎤
再将权重向量表示如下:
Θ
=
[
(
θ
(
1
)
)
T
(
θ
(
2
)
)
T
⋮
(
θ
(
n
u
)
)
T
]
\Theta = \left[\begin{matrix}(\theta^{(1)})^T \\ (\theta^{(2)})^T \\ \vdots \\ (\theta^{(n_u)})^T \end{matrix}\right]
Θ=⎣⎢⎢⎢⎡(θ(1))T(θ(2))T⋮(θ(nu))T⎦⎥⎥⎥⎤
那么我们就可以将评分矩阵表示为两者的乘积,即:
F
=
X
Θ
T
F = X \Theta^T
F=XΘT
该方法也称为 低秩矩阵分解(low rank matrix factorization)。
通过计算得出每个电影的特征向量
x
(
i
)
x^{(i)}
x(i) 后,我们可以通过如下的方式衡量两个电影
i
i
i 与
k
k
k 之间的相似度:
∥
x
(
i
)
−
x
(
k
)
∥
\| x^{(i)}- x^{(k)}\|
∥x(i)−x(k)∥
也就是通过衡量两个特征向量之间的距离,距离值越小,表示两个电影越相似,进而找到最相关的两个电影,通过这种方式就可以向用户推荐相似的电影。
5. 均值归一化
我们通过一个例子来说明均值归一化的目的,对于如下的用户评分,
我们可以发现用户 E E E 并没有对任何电影有过评分,对于如下的代价函数:
min x ( 1 ) , ⋯ , x ( n m ) θ ( 1 ) , ⋯ , θ ( n u ) 1 2 ∑ ( i , 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 + λ 2 ∑ j = 1 n u ∑ k = 1 n [ θ k ( j ) ] 2 \min_{x^{(1)},\cdots,x^{(n_m)} \atop \theta^{(1)},\cdots,\theta^{(n_u)}} \frac{1}{2}\sum_{(i,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}\left[x_k^{(i)}\right]^2+ \frac{\lambda}{2}\sum_{j=1}^{n_u}\sum_{k=1}^n\left[\theta_k^{(j)}\right]^2 θ(1),⋯,θ(nu)x(1),⋯,x(nm)min21(i,j):r(i,j)=1∑[(θ(j))Tx(i)−y(i,j)]2+2λi=1∑nmk=1∑n[xk(i)]2+2λj=1∑nuk=1∑n[θk(j)]2
如果我们想要预测用户 E 对每个电影的评分,就要计算其参数向量 θ ( 5 ) \theta^{(5)} θ(5) ,由于当 i = 5 i = 5 i=5 时 r ( i , j ) r(i,j) r(i,j) 都不为 1 1 1 ,所以在计算 θ ( 5 ) \theta^{(5)} θ(5) 时上式的前一项不会有影响,只有最后一项 λ 2 ∑ j = 1 n u ∑ k = 1 n [ θ k ( j ) ] 2 \frac{\lambda}{2}\sum\limits_{j=1}^{n_u}\sum\limits_{k=1}^n\left[\theta_k^{(j)}\right]^2 2λj=1∑nuk=1∑n[θk(j)]2 会对 θ ( 5 ) \theta^{(5)} θ(5) 的值有影响,所以在计算时也会使该式尽可能小,由于只有这一项,所以最后会趋向于使 θ ( 5 ) = [ 0 0 ] \theta^{(5)}=\left[\begin{matrix} 0 \\ 0 \end{matrix}\right] θ(5)=[00],所以最后对用户 E 的所有电影的评分预测 ( θ ( 5 ) ) T x ( i ) (\theta^{(5)})^Tx^{(i)} (θ(5))Tx(i) 都会是 0 0 0。
预测都是 0 0 0 的结果并不是我们想要的,我们并不能根据这个结果得到任何与 E 相关的信息,也就不能根据这些预测结果对用户 E 进行相似的电影推荐。
为了解决这个问题,我们引入均值归一化。首先构造评分矩阵,并计算每个电影获得评分的均值
μ
\mu
μ:
Y
=
[
5
5
0
0
?
5
?
?
0
?
?
4
0
?
?
0
0
5
4
?
0
0
5
0
?
]
μ
=
[
2.5
2.5
2
2.25
1.25
]
Y = \left[\begin{matrix} 5 & 5 & 0 & 0 & ? \\ 5 & ? & ? & 0 & ? \\ ? & 4 & 0 & ? & ? \\ 0 & 0 & 5 & 4 & ? \\ 0 & 0 & 5 & 0 & ? \end{matrix}\right] \quad\quad \mu= \left[\begin{matrix} 2.5 \\ 2.5 \\ 2 \\ 2.25 \\ 1.25 \\ \end{matrix}\right]
Y=⎣⎢⎢⎢⎢⎡55?005?4000?05500?40?????⎦⎥⎥⎥⎥⎤μ=⎣⎢⎢⎢⎢⎡2.52.522.251.25⎦⎥⎥⎥⎥⎤
之后将每个用户对指定电影的评分都减去该电影的均值,那么评分矩阵就变为 :
Y
=
[
2.5
2.5
−
2.5
−
2.5
?
2.5
?
?
−
2.5
?
?
2
−
2
?
?
−
2.25
−
2.25
2.75
1.75
?
−
1.25
−
1.25
3.75
−
1.25
?
]
Y = \left[\begin{matrix} 2.5 & 2.5 & -2.5 & -2.5 & ? \\ 2.5 & ? & ? & -2.5 & ? \\ ? & 2 & -2 & ? & ? \\ -2.25 & -2.25 & 2.75 & 1.75 & ? \\ -1.25 & -1.25 & 3.75 & -1.25 & ? \end{matrix}\right]
Y=⎣⎢⎢⎢⎢⎡2.52.5?−2.25−1.252.5?2−2.25−1.25−2.5?−22.753.75−2.5−2.5?1.75−1.25?????⎦⎥⎥⎥⎥⎤
我们就可以根据新得到的评分矩阵计算参数向量
θ
(
j
)
\theta^{(j)}
θ(j) 和特征向量
x
(
i
)
x^{(i)}
x(i),之后在利用学习到的向量对未知变量预测时,我们就需要加上每个电影对应的均值,即用户
j
j
j 对电影
i
i
i 的预测结果表示为:
(
θ
(
j
)
)
T
x
(
i
)
+
μ
i
(\theta^{(j)})^Tx^{(i)}+\mu_i
(θ(j))Tx(i)+μi
那么最终对用户 E 预测的结果就变成了所有电影获得的评分均值。