第17章 推荐系统
1、概述
推荐系统是现实生活中应用最广泛的积极学习问题,通过对历史数据的分析,把用户感兴趣的商品、服务推荐给用户。
2、基于内容的推荐算法
基于内容的推荐算法,其实就是已知商品的特征,根据特征建立模型,实现推荐系统的方式。
我们以一个案例来介绍推荐算法,这个案例讲贯穿整章内容。
2.1 电影推荐案例
介绍一下上述表格的组成部分:
- 第一列:代表电影的名称,一共有5个电影。
- 第二列:分成4个小列,代表每个人对各个电影的评分。问号代表用户没有进行评分。
- 第三列:电影的特征值, x 1 x_1 x1代表电影是爱情电影的概率; x 2 x_2 x2代表是动作电影的概率。
2.2 符号说明
为了描述方便,我们把本章使用到的符号做个定义:
- n n n_n nn:用户数量。
- n m n_m nm:电影数量。
- r(i,j)=1:代表用户j对电影i进行了评价。
- y(i,j):代表用户j对电影i的评分。
- m ( j ) m^{(j)} m(j):代表用户j评价的电影数量。
- θ ( j ) \theta^{(j)} θ(j):用户j的向量参数。
- x ( i ) x^{(i)} x(i):电影i的特征向量。
- n u n_u nu:代表 θ \theta θ的数量。
- n m n_m nm:代表特征x的数量。
2.3 基本原理
我们假设用户j对电影i的评分为: ( θ ( j ) ) T ∗ X ( i ) (\theta^{(j)})^T*X^{(i)} (θ(j))T∗X(i)。具体原因,恕我无可奉告。
在已知
θ
\theta
θ和X的前提下,就能计算每个用户对每个电影的评分了。
这就是基于内容的推荐算法。
那 θ \theta θ如何计算呢,请看下节。
2.4 θ \theta θ的计算
θ \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)^TX^{(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)TX(i)−y(i,j))2+2m(j)λk=1∑n(θk(j))2
m
(
j
)
m^{(j)}
m(j)代表用户评价的电影的数量,是一个常量,可以从商户公式中去掉:
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)^TX^{(i)}-y^{(i,j)})^2+\frac{\lambda}{2}\sum_{k=1}^n(\theta_k^{(j)})^2
minθj:21i:r(i,j)=1∑((θj)TX(i)−y(i,j))2+2λk=1∑n(θk(j))2
求所有的
θ
\theta
θ值:
J
(
θ
(
1
)
,
θ
(
2
)
,
θ
(
3
)
.
.
.
.
.
.
θ
(
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^{(3)}......\theta^{(n_u)})=\frac{1}{2}\sum_{j=1}^{n_u}\sum_{i:r(i,j)=1}((\theta^j)^TX^{(i)}-y^{(i,j)})^2+\frac{\lambda}{2}\sum_{j=1}^{n_u}\sum_{k=1}^n(\theta_k^{(j)})^2
J(θ(1),θ(2),θ(3)......θ(nu))=21j=1∑nui:r(i,j)=1∑((θj)TX(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!=0)
θk(j):=θk(j)−α(∑i:r(i,j)=1((θ(j))TX(i)−y(i,j))xk(i)+λθk(j))(for k!=0)
3、协同过滤
上面介绍的是已知特征的情况下,可以推导出
θ
\theta
θ,从而构建推荐模型。
本节讲的是另外一种情况,假设
θ
\theta
θ是已知的,特征是未知的,通过
θ
\theta
θ来自动构建特征的过程,这种方式称为协同过滤。
3.1 前提
前提:每个用户都对数个电影进行了评分,通过观察大量的数据,得到每个电影的特征值,相当于每个用户都在协助改进算法。
3.2 原理
根据之前的定义我们知道用户j对电影i的评分为 ( θ ( j ) ) T X ( i ) (\theta^{(j)})^TX^{(i)} (θ(j))TX(i),现在已知 θ \theta θ、评分求解X,则公式为:
m i n x ( i ) min_x^{(i)} minx(i): 1 2 ∑ j : r ( i , j ) = 1 ( ( θ ( j ) ) T X ( i ) − y ( i , j ) ) 2 + λ 2 ∑ k = 1 n ( x k ( i ) ) 2 \frac{1}{2}\sum_{j:r(i,j)=1}((\theta^{(j)})^TX^{(i)}-y^{(i,j)})^2+\frac{\lambda}{2}\sum_{k=1}^n(x_k^{(i)})^2 21∑j:r(i,j)=1((θ(j))TX(i)−y(i,j))2+2λ∑k=1n(xk(i))2
求解所有的X:
m
i
n
x
(
1
)
,
x
(
2
)
.
.
.
x
(
n
m
)
min_{x^{(1)},x^{(2)}...x^{(n_m)}}
minx(1),x(2)...x(nm):
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}((\theta^{(j)})^TX^{(i)}-y^{(i,j)})^2+\frac{\lambda}{2}\sum_{i=1}^{n_m}\sum_{k=1}^n(x_k^{(i)})^2
21∑i=1nm∑j:r(i,j)=1((θ(j))TX(i)−y(i,j))2+2λ∑i=1nm∑k=1n(xk(i))2
3.3 计算步骤
- 先取一个随机的 θ \theta θ
- 根据上述公式计算出X。
- 对 θ \theta θ进行优化。
- 重新计算x
- …
3.4 同时计算 θ 、 X \theta、 X θ、X
有一种同时计算
θ
X
\theta X
θX的方式,公式为:
J
(
x
(
1
)
,
x
(
2
)
,
x
(
3
)
.
.
.
,
x
(
n
m
)
,
θ
(
1
)
,
θ
(
2
)
,
θ
(
3
)
.
.
.
.
.
.
θ
(
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
J(x^{(1)},x^{(2)},x^{(3)}...,x^{(n_m)},\theta^{(1)},\theta^{(2)},\theta^{(3)}......\theta^{(n_u)})=\frac{1}{2}\sum_{(i,j):r(i,j)=1}((\theta^j)^TX^{(i)}-y^{(i,j)})^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
J(x(1),x(2),x(3)...,x(nm),θ(1),θ(2),θ(3)......θ(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
注意:该算法中,不包含 x 0 θ 0 x_0 \theta_0 x0θ0的值。
计算步骤为:
- 随机初始化 θ x \theta \ x θ x为较小的值。
- 使用梯度下降算法优化 θ x \theta \ x θ x。
θ 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 ( i ) : = x k ( i ) − α ( ∑ i : r ( i , j ) = 1 ( ( θ ( j ) ) T X ( i ) − y ( i , j ) ) θ k ( j ) + λ X ( i ) ) x_k^{(i)}:=x_k^{(i)}-\alpha(\sum_{i:r(i,j)=1}((\theta^{(j)})^TX^{(i)}-y^{(i,j)})\theta_k^{(j)}+\lambda{X^{(i)}}) xk(i):=xk(i)−α(∑i:r(i,j)=1((θ(j))TX(i)−y(i,j))θk(j)+λX(i))
4、矢量化实现
矢量化是一种表示方式的变化。
我们来看一下上面的这张图:
- Y:每行代表每个用户对一个电影的评分结果。
- Predicted ratings:预测的公式, ( θ ( j ) ) 2 x ( i ) (\theta^{(j)})^2x^{(i)} (θ(j))2x(i)。用这个来预测Y的值。
- 假设X
Θ
\Theta
Θ 为两个矩阵,则
Y
=
X
Θ
T
Y=X\Theta^T
Y=XΘT
这就是矢量化表示方式,也称为“低秩矩阵分解算法”。
5、均值归一化
有些用户从来不对电影进行评分,针对于这种用户,如何进行推送呢?
通过上面的方式,因为r(i,j)!=1,所以该用户对所有电影的评分结果计算出来都是0,这对于推荐系统没有任何意义,而均值归一化是一种解决思路。
均值归一化:就是计算所有用户对电影的评分的平均值,作为该用户的评分返回。
介绍一下上图的元素:
- Y:代表用户对电影的评分,可以看出最后一个用户,没有进行任何评分。
- μ \mu μ代表每个电影评分的平均值。
- 使用Y减去平均值得到新的Y。
- 预测评分的公式为: ( θ ( j ) ) T x ( i ) (\theta^{(j)})^T{x^{(i)}} (θ(j))Tx(i),由于每个y值都减去了平均值,所以公式需要加上平均值: ( θ ( j ) ) T x ( i ) + μ i (\theta^{(j)})^T{x^{(i)}} +\mu_i (θ(j))Tx(i)+μi
- 所以没有评分的用户的评分: ( θ ( j ) ) T x ( i ) + μ i = 0 + μ i = μ i (\theta^{(j)})^T{x^{(i)}} +\mu_i=0+\mu_i=\mu_i (θ(j))Tx(i)+μi=0+μi=μi