基于内容的推荐算法
符号定义
- n u n_u nu:用户的数量
- n m n_m nm:电影的数量
- r ( i , j ) = 1 r(i,j) = 1 r(i,j)=1:表示用户 j 有对 电影 i 做出评价
- y ( i , j ) y^{(i,j)} y(i,j):当 r ( i , j ) = 1 r(i,j) = 1 r(i,j)=1 时,用户 j 对电影 i 的评分
- m ( j ) m^{(j)} m(j):用户 j 评价过的电影数目
如下图, n u = 4 , n m = 5 n_u = 4,n_m = 5 nu=4,nm=5
假设每一部电影都有一个特征集 x,上图用 x 1 , x 2 x_1,x_2 x1,x2 表示, x 1 x_1 x1 衡量一部电影为爱情片的程度, x 2 x_2 x2 衡量一部电影为动作片的程度,此外,用 x 0 = 1 x_0 = 1 x0=1 表示截距项,则 x ( 1 ) = [ 1 0.9 0 ] x^{(1)} = \begin{bmatrix} 1\\ 0.9\\ 0\\ \end{bmatrix} x(1)=⎣⎡10.90⎦⎤
我们可以把每一个用户的预测评价值当做线性回归问题。对于每个用户 j,需要学习参数 θ ( j ) ∈ R n + 1 \theta^{(j)} \in \Bbb R^{n+1} θ(j)∈Rn+1,n 为特征数量,之后便可用 ( θ ( j ) ) T x ( i ) (\theta^{(j)})^Tx^{(i)} (θ(j))Tx(i) 预测用户 j 电影 i 的评分。
例如,预测用户 1 对电影 3 的评分,假设学习到 θ ( 1 ) = [ 0 5 0 ] \theta^{(1)} = \begin{bmatrix} 0\\5\\0 \end{bmatrix} θ(1)=⎣⎡050⎦⎤, x ( 3 ) = [ 1 0.99 0 ] x^{(3)} = \begin{bmatrix} 1\\0.99\\0 \end{bmatrix} x(3)=⎣⎡10.990⎦⎤,则有 ( θ ( 1 ) ) T x ( 3 ) = 0.99 × 5 = 4.95 (\theta^{(1)})^Tx^{(3)} = 0.99 \times 5 = 4.95 (θ(1))Tx(3)=0.99×5=4.95
参数 θ \theta θ 可通过最小化一下式子求得:
m i n θ ( j ) 1 2 m ( j ) ∑ i : r ( i , j ) = 1 ( ( θ ( j ) ) T ( x ( i ) ) − y ( i , j ) ) 2 + λ 2 m ( j ) ∑ k = 1 n ( θ k ( j ) ) 2 min_{\theta^{(j)}} \frac{1}{2m^{(j)}}\sum_{i:r(i,j)=1}((\theta^{(j)})^T(x^{(i)}) - y^{(i,j)})^2 + \frac{\lambda}{2m^{(j)}}\sum_{k=1}^n(\theta_k^{(j)})^2 minθ(j)2m(j)1i:r(i,j)=1∑((θ(j))T(x(i))−y(i,j))2+2m(j)λk=1∑n(θk(j))2
其中, ∑ i : r ( i , j ) = 1 \sum_{i:r(i,j) =1} ∑i:r(i,j)=1 表示用户 j 对所有电影的评分总和,为了使式子更简单,可以去掉 m ( j ) m^{(j)} m(j)( m ( j ) m^{(j)} m(j) 是常数,去掉之后 θ \theta θ 的值不变)
m i n θ ( 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}((\theta^{(j)})^T(x^{(i)}) - y^{(i,j)})^2 + \frac{\lambda}{2}\sum_{k=1}^n(\theta_k^{(j)})^2 minθ(j)21i:r(i,j)=1∑((θ(j))T(x(i))−y(i,j))2+2λk=1∑n(θk(j))2
对所有 θ \theta θ:
J ( θ ( 1 ) , θ ( 2 ) , . . . , θ ( n u ) ) = m i n θ ( 1 ) , θ ( 2 ) , . . . , θ ( 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 J(\theta^{(1)},\theta^{(2)},...,\theta^{(n_u)}) = min_{\theta^{(1)},\theta^{(2)},...,\theta^{(n_u)}} \frac{1}{2}\sum_{j=1}^{n_u} \sum_{i:r(i,j)=1}((\theta^{(j)})^T(x^{(i)}) - y^{(i,j)})^2 + \frac{\lambda}{2}\sum_{j=1}^{n_u} \sum_{k=1}^n(\theta_k^{(j)})^2 J(θ(1),θ(2),...,θ(nu))=minθ(1),θ(2),...,θ(nu)21j=1∑nui:r(i,j)=1∑((θ(j))T(x(i))−y(i,j))2+2λj=1∑nuk=1∑n(θk(j))2
若使用梯度下降算法更新 θ \theta θ:
θ k ( j ) : = θ k ( j ) − α ∑ i : r ( i , j ) = 1 ( ( θ ( j ) ) T x ( i ) − y ( i , j ) ) x k ( i ) ( f o r k = 0 ) \theta_k^{(j)} := \theta_k^{(j)} - \alpha\sum_{i:r(i,j)=1}((\theta^{(j)})^Tx^{(i)} - y^{(i,j)})x_k^{(i)}~~(for ~ k = 0) θk(j):=θk(j)−αi:r(i,j)=1∑((θ(j))Tx(i)−y(i,j))xk(i) (for k=0)
θ k ( j ) : = θ k ( j ) − α ( ∑ i : r ( i , j ) = 1 ( ( θ ( j ) ) T x ( i ) − y ( i , j ) ) x k ( i ) + λ θ k ( j ) ) ( f o r k ≠ 0 ) \theta_k^{(j)} := \theta_k^{(j)} - \alpha(\sum_{i:r(i,j)=1}((\theta^{(j)})^Tx^{(i)} - y^{(i,j)})x_k^{(i)} + \lambda\theta_k^{(j)})~~(for ~ k \neq 0) θk(j):=θk(j)−α(i:r(i,j)=1∑((θ(j))Tx(i)−y(i,j))xk(i)+λθk(j)) (for k=0)
协同过滤
基于内容的推荐算法要求取得每部电影的特征值,然而这是很难的。对此,有另外一种算法无需取得特征值,而只要根据用户的爱好矩阵 θ \theta θ 便可预测出用户对电影的评分。
给定 θ ( 1 ) , . . . , θ ( n u ) \theta^{(1)},...,\theta^{(n_u)} θ(1),...,θ(nu),则该算法的优化目标为:
m i n x ( 1 ) , x ( 2 ) , . . . , 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)},x^{(2)},...,x^{(n_m)}} \frac{1}{2}\sum_{i=1}^{n_m} \sum_{j:r(i,j)=1}((\theta^{(j)})^T(x^{(i)}) - y^{(i,j)})^2 + \frac{\lambda}{2}\sum_{i=1}^{n_m} \sum_{k=1}^n(x_k^{(i)})^2 minx(1),x(2),...,x(nm)21i=1∑nmj:r(i,j)=1∑((θ(j))T(x(i))−y(i,j))2+2λi=1∑nmk=1∑n(xk(i))2
然后便可根据 ( θ ( j ) ) T x ( i ) (\theta^{(j)})^Tx^{(i)} (θ(j))Tx(i) 预测用户 j 电影 i 的评分。
因此在预测用户 j 电影 i 的评分时,我们可以结合两种算法,轮流计算 x 与 θ \theta θ
协同过滤算法
在前面的内容中,需要不断迭代计算出 θ \theta θ 与 x 的值,而事实上,有一种更高效的方法可以同时计算出 x 与 θ \theta θ 的值,即同时最小化 θ ( 1 ) , . . . θ ( n u ) , x ( 1 ) , . . . , x ( n m ) \theta^{(1)},...\theta^{(n_u)},x^{(1)},...,x^{(n_m)} θ(1),...θ(nu),x(1),...,x(nm)
m i n θ ( 1 ) , . . . θ ( n u ) , x ( 1 ) , . . . , x ( n m ) J ( θ ( 1 ) , . . . θ ( n u ) , x ( 1 ) , . . . , x ( n m ) ) = 1 2 ∑ ( i , j ) : r ( i , j ) = 1 ( ( θ ( j ) ) T ( x ( i ) ) − y ( i , j ) ) 2 + λ 2 ∑ j = 1 n m ∑ k = 1 n ( x k ( i ) ) 2 + λ 2 ∑ i = 1 n u ∑ k = 1 n ( θ k ( i ) ) 2 min_{\theta^{(1)},...\theta^{(n_u)},x^{(1)},...,x^{(n_m)}}J(\theta^{(1)},...\theta^{(n_u)},x^{(1)},...,x^{(n_m)}) = \frac{1}{2}\sum_{(i,j):r(i,j)=1}((\theta^{(j)})^T(x^{(i)}) - y^{(i,j)})^2 + \frac{\lambda}{2}\sum_{j=1}^{n_m} \sum_{k=1}^n(x_k^{(i)})^2 + \frac{\lambda}{2}\sum_{i=1}^{n_u} \sum_{k=1}^n(\theta_k^{(i)})^2 minθ(1),...θ(nu),x(1),...,x(nm)J(θ(1),...θ(nu),x(1),...,x(nm))=21(i,j):r(i,j)=1∑((θ(j))T(x(i))−y(i,j))2+2λj=1∑nmk=1∑n(xk(i))2+2λi=1∑nuk=1∑n(θk(i))2
协同过滤算法步骤:
- 将 θ ( 1 ) , . . . θ ( n u ) , x ( 1 ) , . . . , x ( n m ) \theta^{(1)},...\theta^{(n_u)},x^{(1)},...,x^{(n_m)} θ(1),...θ(nu),x(1),...,x(nm) 随机初始化为比较小的值
- 使用梯度下降算法(或其他算法)最小化
m
i
n
θ
(
1
)
,
.
.
.
θ
(
n
u
)
,
x
(
1
)
,
.
.
.
,
x
(
n
m
)
J
(
θ
(
1
)
,
.
.
.
θ
(
n
u
)
,
x
(
1
)
,
.
.
.
,
x
(
n
m
)
)
min_{\theta^{(1)},...\theta^{(n_u)},x^{(1)},...,x^{(n_m)}}J(\theta^{(1)},...\theta^{(n_u)},x^{(1)},...,x^{(n_m)})
minθ(1),...θ(nu),x(1),...,x(nm)J(θ(1),...θ(nu),x(1),...,x(nm)),即对
j
=
1
,
.
.
.
,
n
u
,
i
=
1
,
.
.
.
,
n
m
j = 1,...,n_u, i = 1,...,n_m
j=1,...,nu,i=1,...,nm:
θ k ( j ) : = θ k ( j ) − α ( ∑ i : r ( i , j ) = 1 ( ( θ ( j ) ) T x ( i ) − y ( i , j ) ) x k ( i ) + λ θ k ( j ) ) \theta_k^{(j)} := \theta_k^{(j)} - \alpha(\sum_{i:r(i,j)=1}((\theta^{(j)})^Tx^{(i)} - y^{(i,j)})x_k^{(i)} + \lambda\theta_k^{(j)}) θk(j):=θk(j)−α(i:r(i,j)=1∑((θ(j))Tx(i)−y(i,j))xk(i)+λθk(j))
x k ( j ) : = x k ( j ) − α ( ∑ j : r ( i , j ) = 1 ( ( θ ( j ) ) T x ( i ) − y ( i , j ) ) θ k ( i ) + λ x k ( j ) ) x_k^{(j)} := x_k^{(j)} - \alpha(\sum_{j:r(i,j)=1}((\theta^{(j)})^Tx^{(i)} - y^{(i,j)})\theta_k^{(i)} + \lambda x_k^{(j)}) xk(j):=xk(j)−α(j:r(i,j)=1∑((θ(j))Tx(i)−y(i,j))θk(i)+λxk(j))
(这里不取 x 0 , θ 0 x_0,\theta_0 x0,θ0) - 预测评分 ( θ ( j ) ) T x ( i ) (\theta^{(j)})^Tx^{(i)} (θ(j))Tx(i)
均值规范化
假设有一个没有对任何电影评分的用户,算法该如何预测其对电影的评分?
若使用前面提到的算法,则对于该用户,其优化目标变为
m
i
n
θ
(
j
)
λ
2
∑
j
=
1
n
u
∑
k
=
1
n
(
θ
k
(
j
)
)
2
min_\theta^{(j)}\frac{\lambda}{2}\sum_{j=1}^{n_u}\sum_{k=1}^n(\theta_k^{(j)})^2
minθ(j)2λ∑j=1nu∑k=1n(θk(j))2
无疑,算法会给出
θ
(
5
)
=
[
0
0
]
\theta^{(5)} = \begin{bmatrix} 0\\0 \end{bmatrix}
θ(5)=[00]
因此,对于用户Eve,预测评分全为 0,这并没有实际意义
均值归一化可以解决这个问题
将所有的评分矩阵化,得到 Y = [ 5 5 0 0 ? 5 ? ? 0 ? ? 4 0 ? ? 0 0 5 4 ? 0 0 5 0 ? ] Y = \begin{bmatrix} 5~~5~~0~~0~~?\\ 5~~?~~?~~0~~?\\ ?~~4~~0~~?~~?\\ 0~~0~~5~~4~~?\\ 0~~0~~5~~0~~?\\ \end{bmatrix} Y=⎣⎢⎢⎢⎢⎡5 5 0 0 ?5 ? ? 0 ?? 4 0 ? ?0 0 5 4 ?0 0 5 0 ?⎦⎥⎥⎥⎥⎤
对 Y 求均值,得到 μ = [ 2.5 2.5 2 2.25 1.25 ] \mu = \begin{bmatrix} 2.5\\ 2.5\\ 2\\ 2.25\\ 1.25 \end{bmatrix} μ=⎣⎢⎢⎢⎢⎡2.52.522.251.25⎦⎥⎥⎥⎥⎤
令 Y 中每个值减去均值,得 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 = \begin{bmatrix} 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{bmatrix} 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 作为用户评分矩阵, 用 ( θ ( j ) ) T x ( i ) + μ i (\theta^{(j)})^Tx^{(i)} + \mu_i (θ(j))Tx(i)+μi 预测新的得分(因为前面减去了均值 μ i \mu_i μi)
则对于没有给电影评过分的用户 Eve,可得到其预测得分为 [ 2.5 2.5 2 2.25 1.25 ] \begin{bmatrix} 2.5\\ 2.5\\ 2\\ 2.25\\ 1.25 \end{bmatrix} ⎣⎢⎢⎢⎢⎡2.52.522.251.25⎦⎥⎥⎥⎥⎤