机器学习
(主要参考 吴恩达机器学习)
线性回归
线性回归是机器学习中比较基本的一个算法。其基本思想大致可以理解为给定一个数据集,通过线性回归得到一条曲线,尽可能地去拟合这个数据集。如下图所示:
那么,如何得到这样一条拟合曲线呢?一个自然而然的想法是建立一个输入
x
x
x到输出
y
^
\hat{y}
y^的拟合函数,使得这个函数的输出
y
^
\hat{y}
y^能够尽可能地接近真实值
y
y
y。
通常,这个拟合函数可以被定义为:
h
θ
(
x
)
=
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
⋯
+
θ
n
x
n
=
θ
T
x
h_{\theta}\left(x\right)=\theta_0+\theta_1x_1+\theta_2x_2+\dots+\theta_nx_n=\boldsymbol{\theta}^T\boldsymbol{x}
hθ(x)=θ0+θ1x1+θ2x2+⋯+θnxn=θTx
其中,
θ
=
[
θ
0
,
θ
1
,
…
,
θ
n
]
T
\boldsymbol{\theta}=\left[\theta_0,\theta_1,\dots,\theta_n\right]^T
θ=[θ0,θ1,…,θn]T,表示参数的集合(线性回归的目的就是找到一组合适的参数,去拟合给定的数据集),
x
=
[
x
0
,
x
1
,
…
,
x
n
]
T
\boldsymbol{x}=\left[x_0,x_1,\dots,x_n\right]^T
x=[x0,x1,…,xn]T表示数据的特征,并且通常
x
0
=
1
x_0=1
x0=1。例如,预测房价随房子面积变化的趋势,房子的面积,楼层,房间数等都可作为数据的特征,分别用
x
1
,
x
2
,
x
3
,
…
x_1,x_2,x_3,\dots
x1,x2,x3,…表示。
因此,我们的任务就是去寻找这一组合适的
θ
\boldsymbol{\theta}
θ去构建上述拟合函数。这样我们就可以引入机器学习中另外一个常见的名词:代价函数。其主要作用就是衡量拟合函数的输出
y
^
\hat{y}
y^和真实值
y
y
y之间的偏差(值越小,说明越接近真实值)。在线性回归中,代价函数的定义为:
J
(
θ
)
=
1
2
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
J\left(\boldsymbol{\theta}\right)=\frac{1}{2m}\sum_{i=1}^m\left(h_\boldsymbol{\theta}\left(x^{\left(i\right)}\right)-y^{\left(i\right)}\right)^2
J(θ)=2m1i=1∑m(hθ(x(i))−y(i))2
其中,
m
m
m表示训练集的数量,
x
(
i
)
x^{\left(i\right)}
x(i)的上标仅仅表示第
i
i
i个训练数据。为了找到
θ
\boldsymbol{\theta}
θ,目标就转换为了
m
i
n
θ
J
(
θ
)
\mathop{min}\limits_{\theta}J\left(\theta\right)
θminJ(θ)。
下一步就是如何求
m
i
n
θ
J
(
θ
)
\mathop{min}\limits_{\theta}J\left(\boldsymbol{\theta}\right)
θminJ(θ)。我们最熟悉的做法就是梯度下降了,具体做法为:
r
e
p
e
a
t
u
n
t
i
l
c
o
n
v
e
r
g
e
n
c
e
θ
j
≔
θ
j
−
α
∂
∂
θ
j
J
(
θ
)
repeat\ until\ convergence\ \theta_j\coloneqq\theta_j-\alpha\frac{\partial}{\partial\theta_j}J\left(\boldsymbol{\theta}\right)
repeat until convergence θj:=θj−α∂θj∂J(θ)
针对每一个具体的
θ
j
\theta_j
θj,其具体的更新公式为:
θ
0
≔
θ
0
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
⋅
x
0
(
i
)
θ
1
≔
θ
1
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
⋅
x
1
(
i
)
θ
2
≔
θ
2
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
⋅
x
2
(
i
)
…
θ
n
≔
θ
n
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
⋅
x
n
(
i
)
\theta_0\coloneqq\theta_0-\alpha\frac{1}{m}\sum_{i=1}^m\left(h_\theta\left(x^{\left(i\right)}\right)-y^{\left(i\right)}\right)\cdot x_0^{\left(i\right)}\\ \theta_1\coloneqq\theta_1-\alpha\frac{1}{m}\sum_{i=1}^m\left(h_\theta\left(x^{\left(i\right)}\right)-y^{\left(i\right)}\right)\cdot x_1^{\left(i\right)}\\ \theta_2\coloneqq\theta_2-\alpha\frac{1}{m}\sum_{i=1}^m\left(h_\theta\left(x^{\left(i\right)}\right)-y^{\left(i\right)}\right)\cdot x_2^{\left(i\right)}\\\dots\\ \theta_n\coloneqq\theta_n-\alpha\frac{1}{m}\sum_{i=1}^m\left(h_\theta\left(x^{\left(i\right)}\right)-y^{\left(i\right)}\right)\cdot x_n^{\left(i\right)}
θ0:=θ0−αm1i=1∑m(hθ(x(i))−y(i))⋅x0(i)θ1:=θ1−αm1i=1∑m(hθ(x(i))−y(i))⋅x1(i)θ2:=θ2−αm1i=1∑m(hθ(x(i))−y(i))⋅x2(i)…θn:=θn−αm1i=1∑m(hθ(x(i))−y(i))⋅xn(i)
重复上述过程,直到算法收敛。最终,我们就得到了一组合适的参数
θ
∗
=
[
θ
0
∗
,
θ
1
∗
,
…
,
θ
n
∗
]
T
\boldsymbol{\theta^*}=\left[\theta_0^*,\theta_1^*,\dots,\theta_n^*\right]^T
θ∗=[θ0∗,θ1∗,…,θn∗]T。
以上就是线性回归的全部流程,下面介绍logistic回归(也叫逻辑回归)。
logistic回归
在上面的线性回归中要预测的变量
y
^
\hat{y}
y^是一个连续值,而logistic回归主要用于分类问题,要预测的变量
y
^
\hat{y}
y^是一个离散值。通常其取值是一个有限离散值的集合,即
y
∈
{
0
,
1
,
2
,
…
}
y\in\{0,1,2,\dots\}
y∈{0,1,2,…},最常见的二元分类中
y
∈
{
0
,
1
}
y\in\{0,1\}
y∈{0,1}。logistic的原理和线性回归大致相同。具体区别主要在于拟合函数
h
θ
(
x
)
h_{\boldsymbol\theta}\left(x\right)
hθ(x)和代价函数
J
(
θ
)
J\left(\boldsymbol\theta\right)
J(θ)。在线性回归中,我们已经知道
h
θ
(
x
)
=
θ
T
x
h_{\boldsymbol\theta}\left(x\right)=\boldsymbol\theta^T\boldsymbol{x}
hθ(x)=θTx,而在logistic回归中,拟合函数为:
h
θ
(
x
)
=
g
(
θ
T
x
)
其
中
,
g
(
z
)
=
1
1
+
e
−
1
h_{\theta}\left(x\right)=g\left(\boldsymbol\theta^T\boldsymbol{x}\right)\\[3pt]其中,g\left(z\right)=\frac{1}{1+e^{-1}}
hθ(x)=g(θTx)其中,g(z)=1+e−11
有了拟合函数,按照线性回归的流程,下面就是代价函数了。如果logistic回归仍然采用和线性回归一样的代价函数,按照吴恩达老师在视频中的说法,由于拟合函数
h
θ
(
x
)
h_{\theta}\left(x\right)
hθ(x)的改变,会使最终的代价函数
J
(
θ
)
J\left(\boldsymbol\theta\right)
J(θ)变为非凸的函数,从而无法很好地利用梯度下降法去求解。为此,在logistic回归中,代价函数变成了下列形式:
J
(
θ
)
=
{
−
log
(
h
θ
(
x
)
)
,
y
=
1
−
log
(
1
−
h
θ
(
x
)
)
,
y
=
0
J\left(\boldsymbol\theta\right)=\left\{ \begin{aligned} -\log\left(h_{\boldsymbol\theta}\left(x\right)\right),\ y=1 \\ -\log\left(1-h_{\boldsymbol\theta}\left(x\right)\right),\ y=0 \end{aligned} \right.
J(θ)={−log(hθ(x)), y=1−log(1−hθ(x)), y=0
为了简化公式,上述分段函数可以进一步写成:
J
(
θ
)
=
−
y
log
(
h
θ
(
x
)
)
−
(
1
−
y
)
log
(
1
−
h
θ
(
x
)
)
J\left(\boldsymbol\theta\right)=-y\log\left(h_{\boldsymbol\theta}\left(x\right)\right)-\left(1-y\right)\log\left(1-h_{\boldsymbol\theta}\left(x\right)\right)
J(θ)=−ylog(hθ(x))−(1−y)log(1−hθ(x))
于是,针对m个训练集,最终的代价函数为:
J
(
θ
)
=
−
1
m
∑
i
=
1
m
[
y
(
i
)
log
h
θ
(
x
(
i
)
)
+
(
1
−
y
(
i
)
)
log
(
1
−
h
θ
(
x
(
i
)
)
)
]
J\left(\boldsymbol\theta\right)=-\frac{1}{m}\sum_{i=1}^m\left[y^{\left(i\right)}\log{h_{\boldsymbol\theta}\left(x^{\left(i\right)}\right)}+\left(1-y^{\left(i\right)}\right)\log\left(1-h_{\boldsymbol\theta}\left(x^{\left(i\right)}\right)\right)\right]
J(θ)=−m1i=1∑m[y(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i)))]
接下来的流程就和线性回归一致了,即利用梯度下降,通过多次迭代,最终得到一组合适的参数
θ
=
[
θ
0
,
θ
1
,
…
,
θ
n
]
T
\boldsymbol{\theta}=\left[\theta_0,\theta_1,\dots,\theta_n\right]^T
θ=[θ0,θ1,…,θn]T。
r
e
p
e
a
t
u
n
t
i
l
c
o
n
v
e
r
g
e
n
c
e
θ
j
≔
θ
j
−
α
∂
∂
θ
j
J
(
θ
)
repeat\ until\ convergence\ \theta_j\coloneqq\theta_j-\alpha\frac{\partial}{\partial\theta_j}J\left(\boldsymbol{\theta}\right)
repeat until convergence θj:=θj−α∂θj∂J(θ)
针对每一个具体的
θ
j
\theta_j
θj,其具体的更新公式为:
θ
0
≔
θ
0
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
⋅
x
0
(
i
)
θ
1
≔
θ
1
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
⋅
x
1
(
i
)
θ
2
≔
θ
2
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
⋅
x
2
(
i
)
…
θ
n
≔
θ
n
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
⋅
x
n
(
i
)
\theta_0\coloneqq\theta_0-\alpha\frac{1}{m}\sum_{i=1}^m\left(h_\theta\left(x^{\left(i\right)}\right)-y^{\left(i\right)}\right)\cdot x_0^{\left(i\right)} \\ \theta_1\coloneqq\theta_1-\alpha\frac{1}{m}\sum_{i=1}^m\left(h_\theta\left(x^{\left(i\right)}\right)-y^{\left(i\right)}\right)\cdot x_1^{\left(i\right)} \\ \theta_2\coloneqq\theta_2-\alpha\frac{1}{m}\sum_{i=1}^m\left(h_\theta\left(x^{\left(i\right)}\right)-y^{\left(i\right)}\right)\cdot x_2^{\left(i\right)}\\\dots\\ \theta_n\coloneqq\theta_n-\alpha\frac{1}{m}\sum_{i=1}^m\left(h_\theta\left(x^{\left(i\right)}\right)-y^{\left(i\right)}\right)\cdot x_n^{\left(i\right)}
θ0:=θ0−αm1i=1∑m(hθ(x(i))−y(i))⋅x0(i)θ1:=θ1−αm1i=1∑m(hθ(x(i))−y(i))⋅x1(i)θ2:=θ2−αm1i=1∑m(hθ(x(i))−y(i))⋅x2(i)…θn:=θn−αm1i=1∑m(hθ(x(i))−y(i))⋅xn(i)
尽管参数的更新公式和线性回归的更新公式一致,但拟合函数
h
θ
(
x
)
h_{\boldsymbol\theta}\left(x\right)
hθ(x)的形式已经发生改变。
下面给出logistic回归中梯度更新公式的具体推导流程:
为了便于推导,我们只考虑含有两个参数的情况(更多参数情况可以类推),即
θ
=
[
θ
0
,
θ
1
]
T
\boldsymbol\theta=[\theta_0,\theta_1]^T
θ=[θ0,θ1]T。此时,
h
θ
(
x
)
=
1
1
+
e
−
(
θ
0
+
θ
1
x
1
)
h_{\boldsymbol\theta}\left(x\right)=\frac{1}{1+e^{-\left(\theta_0+\theta_1x_1\right)}}
hθ(x)=1+e−(θ0+θ1x1)1
J
(
θ
)
=
−
y
log
(
1
1
+
e
−
(
θ
0
+
θ
1
x
1
)
)
−
(
1
−
y
)
log
(
1
−
1
1
+
e
−
(
θ
0
+
θ
1
x
1
)
)
J\left(\boldsymbol\theta\right)=-y\log\left(\frac{1}{1+e^{-\left(\theta_0+\theta_1x_1\right)}}\right)-\left(1-y\right)\log\left(1-\frac{1}{1+e^{-\left(\theta_0+\theta_1x_1\right)}}\right)
J(θ)=−ylog(1+e−(θ0+θ1x1)1)−(1−y)log(1−1+e−(θ0+θ1x1)1)
下面对
θ
1
\theta_1
θ1进行求偏导(以自然对数
e
e
e作为底为例,以2为底也一样,只是多了一个常数):
∂
∂
θ
1
J
(
θ
)
=
−
y
[
1
+
e
−
(
θ
0
+
θ
1
x
1
)
]
⋅
x
1
e
−
(
θ
0
+
θ
1
x
1
)
[
1
+
e
−
(
θ
0
+
θ
1
x
1
)
]
2
−
1
+
e
−
(
θ
0
+
θ
1
x
1
)
e
−
(
θ
0
+
θ
1
x
1
)
⋅
−
x
1
e
−
(
θ
0
+
θ
1
x
1
)
(
1
+
e
−
(
θ
0
+
θ
1
x
1
)
)
+
x
1
e
−
2
(
θ
0
+
θ
1
x
1
)
[
1
+
e
−
(
θ
0
+
θ
1
x
1
)
]
2
+
y
1
+
e
−
(
θ
0
+
θ
1
x
1
)
e
−
(
θ
0
+
θ
1
x
1
)
⋅
−
x
1
e
−
(
θ
0
+
θ
1
x
1
)
(
1
+
e
−
(
θ
0
+
θ
1
x
1
)
)
+
x
1
e
−
2
(
θ
0
+
θ
1
x
1
)
[
1
+
e
−
(
θ
0
+
θ
1
x
1
)
]
2
=
−
y
⋅
x
1
e
−
(
θ
0
+
θ
1
x
1
)
1
+
e
−
(
θ
0
+
θ
1
x
1
)
+
x
1
1
+
e
−
(
θ
0
+
θ
1
x
1
)
−
y
x
1
1
+
e
−
(
θ
0
+
θ
1
x
1
)
=
x
1
(
1
1
+
e
−
(
θ
0
+
θ
1
x
1
)
−
y
)
=
(
h
θ
(
x
)
−
y
)
x
1
\frac{\partial}{\partial\theta_1}J\left(\boldsymbol{\theta}\right)=-y\left[1+e^{-\left(\theta_0+\theta_1x_1\right)}\right] \cdot \frac{x_1e^{-\left(\theta_0+\theta_1x_1\right)}}{\left[1+e^{-\left(\theta_0+\theta_1x_1\right)}\right]^2}-\\[4pt] \frac{1+e^{-\left(\theta_0+\theta_1x_1\right)}}{e^{-\left(\theta_0+\theta_1x_1\right)}} \cdot \frac{-x_1e^{-\left(\theta_0+\theta_1x_1\right)} \left( 1+e^{-\left(\theta_0+\theta_1x_1\right)} \right)+x_1e^{-2\left(\theta_0+\theta_1x_1\right)}}{\left[1+e^{-\left(\theta_0+\theta_1x_1\right)}\right]^2}+ \\[4pt] y \frac{1+e^{-\left(\theta_0+\theta_1x_1\right)}}{e^{-\left(\theta_0+\theta_1x_1\right)}} \cdot \frac{-x_1e^{-\left(\theta_0+\theta_1x_1\right)} \left( 1+e^{-\left(\theta_0+\theta_1x_1\right)} \right)+x_1e^{-2\left(\theta_0+\theta_1x_1\right)}}{\left[1+e^{-\left(\theta_0+\theta_1x_1\right)}\right]^2} \\[4pt] = -y \cdot \frac{x_1e^{-\left(\theta_0+\theta_1x_1\right)}}{1+e^{-\left(\theta_0+\theta_1x_1\right)}} + \frac{x_1}{1+e^{-\left(\theta_0+\theta_1x_1\right)}} - \frac{yx_1}{1+e^{-\left(\theta_0+\theta_1x_1\right)}} \\[4pt] =x_1\left( \frac{1}{1+e^{-\left(\theta_0+\theta_1x_1\right)}} -y \right)\\[4pt] = \left( h_{\theta}\left( x\right) -y \right)x_1
∂θ1∂J(θ)=−y[1+e−(θ0+θ1x1)]⋅[1+e−(θ0+θ1x1)]2x1e−(θ0+θ1x1)−e−(θ0+θ1x1)1+e−(θ0+θ1x1)⋅[1+e−(θ0+θ1x1)]2−x1e−(θ0+θ1x1)(1+e−(θ0+θ1x1))+x1e−2(θ0+θ1x1)+ye−(θ0+θ1x1)1+e−(θ0+θ1x1)⋅[1+e−(θ0+θ1x1)]2−x1e−(θ0+θ1x1)(1+e−(θ0+θ1x1))+x1e−2(θ0+θ1x1)=−y⋅1+e−(θ0+θ1x1)x1e−(θ0+θ1x1)+1+e−(θ0+θ1x1)x1−1+e−(θ0+θ1x1)yx1=x1(1+e−(θ0+θ1x1)1−y)=(hθ(x)−y)x1
考虑m个训练集:
∂
∂
θ
1
J
(
θ
)
=
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
⋅
x
1
(
i
)
\frac{\partial}{\partial\theta_1}J\left(\boldsymbol{\theta}\right)=\frac{1}{m}\sum_{i=1}^m\left(h_\theta\left(x^{\left(i\right)}\right)-y^{\left(i\right)}\right)\cdot x_1^{\left(i\right)}
∂θ1∂J(θ)=m1i=1∑m(hθ(x(i))−y(i))⋅x1(i)
其余参数推导流程一致。
除了利用梯度下降进行参数优化外,还有一些高级的优化方法,例如Conjugate gradient,BFGS,L-BFGS。感兴趣的可以自行学习。
以上就是线性回归和logistic回归的全部内容,欢迎交流~