1 模型描述
1.1 分类问题
在分类问题中,我们要预测的变量y是离散的值,即判断其结果是否属于某一个类。在二分类问题中,我们将因变量可能属于的两个类分别称为负向类(y=0)和正向类(y=1)。当我们使用线性回归来解决分类时,我们会设定一个阈值0.5,当y>0.5时,我们认为其属于正向类,反之,属于反向类。但是如果使用线性回归,那么假设函数的输出值可能远大于1,或者远小于0,此时,我们就需要使用逻辑回归算法来使输出值永远在0 到1 之间。
1.2 假设函数
逻辑回归的假设函数为
h
Θ
(
x
)
=
g
(
X
θ
)
h _ { \Theta } ( x ) = g \left( X \theta\right)
hΘ(x)=g(Xθ)。
其中g代表逻辑函数(logistic function),也称Sigmoid function,其公式为
g
(
z
)
=
1
1
+
e
−
z
g ( z ) = \frac { 1 } { 1 + e ^ { - z } }
g(z)=1+e−z1,图像如下图。

合起来之后我们得到逻辑回归模型:
h
θ
(
x
)
=
1
1
+
e
−
X
Θ
h _ { \theta } ( x ) = \frac { 1 } { 1 + e ^ { - X \Theta } }
hθ(x)=1+e−XΘ1
h
θ
(
x
)
h _ { \theta } ( x )
hθ(x)的作用是,对于给定的输入变量,根据参数计算输出结果=1(正向类)的可能性。即
h
θ
(
x
)
=
P
(
y
=
1
∣
x
;
θ
)
h _ { \theta } ( x ) = P ( y = 1 | x ; \theta )
hθ(x)=P(y=1∣x;θ)
1.3 判定边界
在逻辑回归中,我们预测:当
h
θ
(
x
)
≥
0.5
h _ { \theta } ( x )\geq0.5
hθ(x)≥0.5 时,预测
y
=
1
y=1
y=1;当
h
θ
(
x
)
<
0.5
h _ { \theta } ( x )<0.5
hθ(x)<0.5 时,预测
y
=
0
y=0
y=0。由
g
(
z
)
=
1
1
+
e
−
z
g ( z ) = \frac { 1 } { 1 + e ^ { - z } }
g(z)=1+e−z1且
z
=
X
Θ
z=X\Theta
z=XΘ可以得到,当
X
Θ
≥
0
X\Theta \geq 0
XΘ≥0时,预测
y
=
1
y=1
y=1;当
X
Θ
<
0
X\Theta < 0
XΘ<0时,预测
y
=
0
y=0
y=0。
假设我们有一个模型
h
θ
(
x
)
=
g
(
θ
0
+
θ
1
x
1
+
θ
2
x
2
)
h _ { \theta } ( x ) = g \left( \theta _ { 0 } + \theta _ { 1 } x _ { 1 } + \theta _ { 2 } x _ { 2 } \right)
hθ(x)=g(θ0+θ1x1+θ2x2),其中
Θ
=
[
−
3
,
1
,
1
]
\Theta = [-3,1,1]
Θ=[−3,1,1],则当
x
1
+
x
2
≥
3
x _ { 1 } + x _ { 2 }\geq 3
x1+x2≥3时,模型将预测y=1。将直线
x
1
+
x
2
=
3
x _ { 1 } + x _ { 2 } = 3
x1+x2=3绘制在坐标轴上,就得到了了模型的分界线,将预测为1和预测为0的两个区域分开。如下图左所示


如上图右所示,若数据呈现如此分布,则我们就需要二次方特征才能构建分界线: h θ ( x ) = g ( θ 0 + θ 1 x 1 + θ 2 x 2 + θ 3 x 1 2 + θ 4 x 2 2 ) h _ { \theta } ( x ) = g \left( \theta _ { 0 } + \theta _ { 1 } x _ { 1 } + \theta _ { 2 } x _ { 2 } + \theta _ { 3 } x _ { 1 } ^ { 2 } + \theta _ { 4 } x _ { 2 } ^ { 2 } \right) hθ(x)=g(θ0+θ1x1+θ2x2+θ3x12+θ4x22),其中 Θ = [ − 1 , 0 , 0 , 1 , 1 ] \Theta = [-1,0,0,1,1] Θ=[−1,0,0,1,1],则我们得到的判定边界恰好是半径为1的圆形。
2 代价函数与梯度下降
2.1 代价函数
在线性回归模型中,我们选择的代价函数是所有模型误差的平方和,如果我们对逻辑回归模型也用这样的代价函数的话,我们得到的代价函数将会是一个非凸函数(non-convex function)如下图,这就意味着代价函数有许多局部最小值,会影响梯度下降算法。

因此我们重新定义逻辑回归的代价函数为:
J
(
θ
)
=
1
m
∑
i
=
1
m
cos
t
(
h
θ
(
x
(
i
)
)
,
y
(
i
)
)
J ( \theta ) = \frac { 1 } { m } \sum _ { i = 1 } ^ { m } \cos t \left( h _ { \theta } \left( x ^ { ( i ) } \right) , y ^ { ( i ) } \right)
J(θ)=m1i=1∑mcost(hθ(x(i)),y(i))其中
Cost
(
h
θ
(
x
)
,
y
)
=
{
−
log
(
h
θ
(
x
)
)
if
y
=
1
−
log
(
1
−
h
θ
(
x
)
)
if
y
=
0
\operatorname { Cost } \left( h _ { \theta } ( x ) , y \right) = \left\{ \begin{aligned} - \log \left( h _ { \theta } ( x ) \right) & \text { if } y = 1 \\ - \log \left( 1 - h _ { \theta } ( x ) \right) & \text { if } y = 0 \end{aligned} \right.
Cost(hθ(x),y)={−log(hθ(x))−log(1−hθ(x)) if y=1 if y=0则代价函数就可以表示为
J
(
θ
)
=
−
1
m
∑
i
=
1
m
[
y
(
i
)
log
(
h
θ
(
x
(
i
)
)
)
+
(
1
−
y
(
i
)
)
log
(
1
−
h
θ
(
x
(
i
)
)
)
]
J ( \theta ) = - \frac { 1 } { m } \sum _ { i = 1 } ^ { m } \left[ y ^ { ( i ) } \log \left( h _ { \theta } \left( x ^ { ( i ) } \right) \right) + \left( 1 - y ^ { ( i ) } \right) \log \left( 1 - h _ { \theta } \left( x ^ { ( i ) } \right) \right) \right]
J(θ)=−m1i=1∑m[y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))]
J
(
Θ
)
=
−
1
m
∑
[
Y
log
(
X
Θ
)
+
(
1
−
Y
)
log
(
1
−
X
Θ
)
]
J(\Theta)=- \frac { 1 } { m }\sum\left[ Y\log \left( X \Theta \right) + \left( 1 - Y \right) \log \left( 1 - X \Theta\right) \right]
J(Θ)=−m1∑[Ylog(XΘ)+(1−Y)log(1−XΘ)]
这样构建的
cost
(
h
θ
(
x
)
,
y
)
\operatorname { cost } \left( h _ { \theta } ( x ) , y \right)
cost(hθ(x),y)的特点是,当实际y=1时,
h
θ
(
x
)
h _ { \theta } ( x )
hθ(x) 越接近1误差越小;当实际y=0时,
h
θ
(
x
)
h _ { \theta } ( x )
hθ(x)越接近0误差越小。
2.2 梯度下降
我们上面所定义的代价函数是一个凸函数,没有局部最优值,仅有全局最优,我们可以使用梯度下降算法来求的能使代价函数最小的参数:
θ
j
:
=
θ
j
−
α
∂
∂
θ
j
J
(
θ
)
\theta _ { j } : = \theta _ { j } - \alpha \frac { \partial } { \partial \theta _ { j } } J ( \theta )
θj:=θj−α∂θj∂J(θ)求导后得到:
θ
j
:
=
θ
j
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
\theta _ { j } : = \theta _ { j } - \alpha \frac { 1 } { m } \sum _ { i = 1 } ^ { m } \left( h _ { \theta } \left( x ^ { ( i ) } \right) - y ^ { ( i ) } \right) x _ { j } ^ { ( i ) }
θj:=θj−αm1i=1∑m(hθ(x(i))−y(i))xj(i)将其向量化后得:
Θ
:
=
Θ
−
α
1
m
(
X
T
(
g
(
X
Θ
)
−
Y
)
)
\Theta : = \Theta - \alpha \frac { 1 } { m } (X^T\left( g(X \Theta ) - Y \right))
Θ:=Θ−αm1(XT(g(XΘ)−Y))
注意,这里的梯度下降算法虽然与线性回归的梯度下降很像,但是这里
h
θ
(
x
)
h _ { \theta } ( x )
hθ(x)与线性回归算法不同,所以两种梯度下降是不一样的
3 高级优化
除了使用梯度下降方法外,还有一些高级优化算法和高级优化概念,这些方法可以使梯度下降进行逻辑回归的速度大大提高,也更适合解决大型机器学习问题。
比如Conjugate Gradient(共轭梯度法),BFGS(变尺度法),L-BFGS(限制变尺度法),这些方法需要重新计算
J
(
θ
)
J(\theta)
J(θ),以及对应的导数项。这三种算法有许多优点:不用自己设定学习率,算法中有一个智能内循环,称为线性搜索算法,可以自己尝试不同学习率并选出最优的;比梯度下降法收敛的更快。
在课程中,举例了Octave中的fminunc函数,这个函数表示无约束最小化函数,我们需要给该函数定义cost及梯度,然后自动进行优化,在python中 scipy.optimize.minimize也可以做到。
4 多分类问题
逻辑回归模型可以用于二分类的问题中,那么当有多个分类时,我们也可以使用逻辑回归来实现,这个算法叫做‘一对多’(one-vs-all)。

如上图所示的训练集,有三个类别,我们用三角形表示y=1,正方形表示y=2,×表示y=3。接着,我们依次将三个类中的一个类标记为正向类(y=1),其余两个类标记为负向类,便得到三个分类模型。将三个模型依次记为 h θ ( 1 ) ( x ) , h θ ( 2 ) ( x ) , h θ ( 3 ) ( x ) h_\theta^{(1)}(x),h_\theta^{(2)}(x),h_\theta^{(3)}(x) hθ(1)(x),hθ(2)(x),hθ(3)(x)。最后得到的一系列模型就可以简记为 h θ ( i ) ( x ) = p ( y = i ∣ x ; θ ) i = ( 1 , 2 , 3 … k ) h_\theta^{(i)}(x) = p(y=i|x;\theta) \quad i=(1,2,3…k) hθ(i)(x)=p(y=i∣x;θ)i=(1,2,3…k),如下图所示。

最后,在测试的时候,将三个模型都运行一遍, h θ ( 1 ) ( x ) , h θ ( 2 ) ( x ) , h θ ( 3 ) ( x ) h_\theta^{(1)}(x),h_\theta^{(2)}(x),h_\theta^{(3)}(x) hθ(1)(x),hθ(2)(x),hθ(3)(x)中的最大值就是该样本所对应的分类,即 max i h θ ( i ) ( x ) \max_{i} h_\theta^{(i)}(x) maxihθ(i)(x)