前言
逻辑回归是分类当中极为经常使用的手段,所以,掌握其内在原理是很是必要的。我会争取在本文中尽量简明地展示逻辑回归(logistic regression)的整个推导过程。web
什么是逻辑回归
逻辑回归在某些书中也被称为对数概率回归,明明被叫作回归,却用在了分类问题上,我我的认为这是由于逻辑回归用了和回归相似的方法来解决了分类问题。 假设有一个二分类问题,输出为
y ∈ { 0 , 1 }
y
∈
{
0
,
1
}
,而线性回归模型产生的预测值为
z = w T x + b
z
=
w
T
x
+
b
是实数值,咱们但愿有一个理想的阶跃函数来帮咱们实现
z
z
值到
0 / 1
0
/
1
值的转化。 网络
ϕ ( z ) = ⎧ ⎩ ⎨ 0 0.5 1 if z < 0 if z = 0 if z > 0
ϕ
(
z
)
=
{
0
if z < 0
0.5
if z = 0
1
if z > 0
然而该函数不连续,咱们但愿有一个单调可微的函数来供咱们使用,因而便找到了
S i g m o i d f u n c t i o n
S
i
g
m
o
i
d
f
u
n
c
t
i
o
n
来替代。
ϕ ( z ) = 1 1 + e − z
ϕ
(
z
)
=
1
1
+
e
−
z
二者的图像以下图所示(图片出自文献2)
图1:sigmoid & step function
有了
S i g m o i d f u c t i o n
S
i
g
m
o
i
d
f
u
c
t
i
o
n
以后,因为其取值在
[ 0 , 1 ]
[
0
,
1
]
,咱们就能够将其视为类
1
1
的后验几率估计
p ( y = 1 | x )
p
(
y
=
1
|
x
)
。说白了,就是若是有了一个测试点
x
x
,那么就能够用
S i g m o i d f u c t i o n
S
i
g
m
o
i
d
f
u
c
t
i
o
n
算出来的结果来当作该点
x
x
属于类别
1
1
的几率大小。
因而,很是天然地,咱们把
S i g m o i d f u c t i o n
S
i
g
m
o
i
d
f
u
c
t
i
o
n
计算获得的值大于等于
0.5
0.5
的归为类别
1
1
,小于
0.5
0.5
的归为类别
0
0
。
y ^ = { 1 0 i f ϕ ( z ) ≥ 0.5 o t h e r w i s e
y
^
=
{
1
i
f
ϕ
(
z
)
≥
0.5
0
o
t
h
e
r
w
i
s
e
同时逻辑回归与自适应线性网络很是类似,二者的区别在于逻辑回归的激活函数是
S i g m o i d f u n c t i o n
S
i
g
m
o
i
d
f
u
n
c
t
i
o
n
而自适应线性网络的激活函数是
y = x
y
=
x
,二者的网络结构以下图所示(图片出自文献1)。
图2:自适应线性网络
图3:逻辑回归网络
逻辑回归的代价函数
好了,所要用的几个函数咱们都有了,接下来要作的就是根据给定的训练集,把参数
w
w
给求出来了。要找参数
w
w
,首先就是得把代价函数(cost function)给定义出来,也就是目标函数。 咱们第一个想到的天然是模仿线性回归的作法,利用偏差平方和来当代价函数。 app
J ( w ) = ∑ i 1 2 ( ϕ ( z ( i ) ) − y ( i ) ) 2
J
(
w
)
=
∑
i
1
2
(
ϕ
(
z
(
i
)
)
−
y
(
i
)
)
2
其中,
z ( i ) = w T x ( i ) + b
z
(
i
)
=
w
T
x
(
i
)
+
b
,
i
i
表示第
i
i
个样本点,
y ( i )
y
(
i
)
表示第
i
i
个样本的真实值,
ϕ ( z ( i ) )
ϕ
(
z
(
i
)
)
表示第
i
i
个样本的预测值。
这时,若是咱们将
ϕ ( z ( i ) ) = 1 1 + e − z ( i )
ϕ
(
z
(
i
)
)
=
1
1
+
e
−
z
(
i
)
代入的话,会发现这是一个非凸函数,这就意味着代价函数有着许多的局部最小值,这不利于咱们的求解。
图4:凸函数和非凸函数
那么咱们不妨来换一个思路解决这个问题。前面,咱们提到了
ϕ ( z )
ϕ
(
z
)
能够视为类
1
1
的后验估计,因此咱们有
p ( y = 1 | x ; w ) = ϕ ( w T x + b ) = ϕ ( z )
p
(
y
=
1
|
x
;
w
)
=
ϕ
(
w
T
x
+
b
)
=
ϕ
(
z
)
p ( y = 0 | x ; w ) = 1 − ϕ ( z )
p
(
y
=
0
|
x
;
w
)
=
1
−
ϕ
(
z
)
其中,
p ( y = 1 | x ; w )
p
(
y
=
1
|
x
;
w
)
表示给定
w
w
,那么
x
x
点
y = 1
y
=
1
的几率大小。
上面两式能够写成通常形式
p ( y | x ; w ) = ϕ ( z ) y ( 1 − ϕ ( z ) ) ( 1 − y )
p
(
y
|
x
;
w
)
=
ϕ
(
z
)
y
(
1
−
ϕ
(
z
)
)
(
1
−
y
)
接下来咱们就要用极大似然估计来根据给定的训练集估计出参数
w
w
。
L ( w ) = ∏ n i = 1 p ( y ( i ) | x ( i ) ; w ) = ∏ n i = 1 ( ϕ ( z ( i ) ) ) y ( i ) ( 1 − ϕ ( z ( i ) ) ) 1 − y ( i )
L
(
w
)
=
∏
i
=
1
n
p
(
y
(
i
)
|
x
(
i
)
;
w
)
=
∏
i
=
1
n
(
ϕ
(
z
(
i
)
)
)
y
(
i
)
(
1
−
ϕ
(
z
(
i
)
)
)
1
−
y
(
i
)
为了简化运算,咱们对上面这个等式的两边都取一个对数
l ( w ) = l n L ( w ) = ∑ n i = 1 y ( i ) l n ( ϕ ( z ( i ) ) ) + ( 1 − y ( i ) ) l n ( 1 − ϕ ( z ( i ) ) )
l
(
w
)
=
l
n
L
(
w
)
=
∑
i
=
1
n
y
(
i
)
l
n
(
ϕ
(
z
(
i
)
)
)
+
(
1
−
y
(
i
)
)
l
n
(
1
−
ϕ
(
z
(
i
)
)
)
咱们如今要求的是使得
l ( w )
l
(
w
)
最大的
w
w
。没错,咱们的代价函数出现了,咱们在
l ( w )
l
(
w
)
前面加个负号不就变成就最小了吗?不就变成咱们代价函数了吗?
J ( w ) = − l ( w ) = − ∑ n i = 1 y ( i ) l n ( ϕ ( z ( i ) ) ) + ( 1 − y ( i ) ) l n ( 1 − ϕ ( z ( i ) ) )
J
(
w
)
=
−
l
(
w
)
=
−
∑
i
=
1
n
y
(
i
)
l
n
(
ϕ
(
z
(
i
)
)
)
+
(
1
−
y
(
i
)
)
l
n
(
1
−
ϕ
(
z
(
i
)
)
)
为了更好地理解这个代价函数,咱们不妨拿一个例子的来看看
J ( ϕ ( z ) , y ; w ) = − y l n ( ϕ ( z ) ) − ( 1 − y ) l n ( 1 − ϕ ( z ) )
J
(
ϕ
(
z
)
,
y
;
w
)
=
−
y
l
n
(
ϕ
(
z
)
)
−
(
1
−
y
)
l
n
(
1
−
ϕ
(
z
)
)
也就是说
J ( ϕ ( z ) , y ; w ) = { − l n ( ϕ ( z ) ) − l n ( 1 − ϕ ( z ) ) i f y = 1 i f y = 0
J
(
ϕ
(
z
)
,
y
;
w
)
=
{
−
l
n
(
ϕ
(
z
)
)
i
f
y
=
1
−
l
n
(
1
−
ϕ
(
z
)
)
i
f
y
=
0
咱们来看看这是一个怎么样的函数
图5:代价函数
从图中不难看出,若是样本的值是
1
1
的话,估计值
ϕ ( z )
ϕ
(
z
)
越接近
1
1
付出的代价就越小,反之越大;同理,若是样本的值是
0
0
的话,估计值
ϕ ( z )
ϕ
(
z
)
越接近
0
0
付出的代价就越小,反之越大。
利用梯度降低法求参数
在开始梯度降低以前,要这里插一句,
s i g m o i d f u n c t i o n
s
i
g
m
o
i
d
f
u
n
c
t
i
o
n
有一个很好的性质就是 机器学习
ϕ ′ ( z ) = ϕ ( z ) ( 1 − ϕ ( z ) )
ϕ
′
(
z
)
=
ϕ
(
z
)
(
1
−
ϕ
(
z
)
)
下面会用到这个性质。
还有,咱们要明确一点,梯度的负方向就是代价函数降低最快的方向。什么?为何?好,我来讲明一下。借助于泰特展开,咱们有
f ( x + δ ) − f ( x ) ≈ f ′ ( x ) ⋅ δ
f
(
x
+
δ
)
−
f
(
x
)
≈
f
′
(
x
)
⋅
δ
其中,
f ′ ( x )
f
′
(
x
)
和
δ
δ
为向量,那么这二者的内积就等于
f ′ ( x ) ⋅ δ = | | f ′ ( x ) | | ⋅ | | δ | | ⋅ c o s θ
f
′
(
x
)
⋅
δ
=
|
|
f
′
(
x
)
|
|
⋅
|
|
δ
|
|
⋅
c
o
s
θ
当
θ = π
θ
=
π
时,也就是
δ
δ
在
f ′ ( x )
f
′
(
x
)
的负方向上时,取得最小值,也就是降低的最快的方向了~
okay?好,坐稳了,咱们要开始降低了。
w := w + Δ w , Δ w = − η ∇ J ( w )
w
:=
w
+
Δ
w
,
Δ
w
=
−
η
∇
J
(
w
)
没错,就是这么降低。没反应过来?那我再写详细一些
w j := w j + Δ w j , Δ w j = − η ∂ J ( w ) ∂ w j
w
j
:=
w
j
+
Δ
w
j
,
Δ
w
j
=
−
η
∂
J
(
w
)
∂
w
j
其中,
w j
w
j
表示第
j
j
个特征的权重;
η
η
为学习率,用来控制步长。
重点来了。
∂ J ( w ) w j = − ∑ n i = 1 ( y ( i ) 1 ϕ ( z ( i ) ) − ( 1 − y ( i ) ) 1 1 − ϕ ( z ( i ) ) ) ∂ ϕ ( z ( i ) ) ∂ w j = − ∑ n i = 1 ( y ( i ) 1 ϕ ( z ( i ) ) − ( 1 − y ( i ) ) 1 1 − ϕ ( z ( i ) ) ) ϕ ( z ( i ) ) ( 1 − ϕ ( z ( i ) ) ) ∂ z ( i ) ∂ w j = − ∑ n i = 1 ( y ( i ) ( 1 − ϕ ( z ( i ) ) ) − ( 1 − y ( i ) ) ϕ ( z ( i ) ) ) x ( i ) j = − ∑ n i = 1 ( y ( i ) − ϕ ( z ( i ) ) ) x ( i ) j
∂
J
(
w
)
w
j
=
−
∑
i
=
1
n
(
y
(
i
)
1
ϕ
(
z
(
i
)
)
−
(
1
−
y
(
i
)
)
1
1
−
ϕ
(
z
(
i
)
)
)
∂
ϕ
(
z
(
i
)
)
∂
w
j
=
−
∑
i
=
1
n
(
y
(
i
)
1
ϕ
(
z
(
i
)
)
−
(
1
−
y
(
i
)
)
1
1
−
ϕ
(
z
(
i
)
)
)
ϕ
(
z
(
i
)
)
(
1
−
ϕ
(
z
(
i
)
)
)
∂
z
(
i
)
∂
w
j
=
−
∑
i
=
1
n
(
y
(
i
)
(
1
−
ϕ
(
z
(
i
)
)
)
−
(
1
−
y
(
i
)
)
ϕ
(
z
(
i
)
)
)
x
j
(
i
)
=
−
∑
i
=
1
n
(
y
(
i
)
−
ϕ
(
z
(
i
)
)
)
x
j
(
i
)
因此,在使用梯度降低法更新权重时,只要根据下式便可
w j := w j + η ∑ n i = 1 ( y ( i ) − ϕ ( z ( i ) ) ) x ( i ) j
w
j
:=
w
j
+
η
∑
i
=
1
n
(
y
(
i
)
−
ϕ
(
z
(
i
)
)
)
x
j
(
i
)
此式与线性回归时更新权重用的式子极为类似,也许这也是逻辑回归要在后面加上回归两个字的缘由吧。
固然,在样本量极大的时候,每次更新权重会很是耗费时间,这时能够采用随机梯度降低法,这时每次迭代时须要将样本从新打乱,而后用下式不断更新权重。
w j := w j + η ( y ( i ) − ϕ ( z ( i ) ) ) x ( i ) j , f o r i i n r a n g e ( n )
w
j
:=
w
j
+
η
(
y
(
i
)
−
ϕ
(
z
(
i
)
)
)
x
j
(
i
)
,
f
o
r
i
i
n
r
a
n
g
e
(
n
)
也就是去掉了求和,而是针对每一个样本点都进行更新。
结束语
以上就是我参考了基本书中的说法以后对逻辑回归整个推到过程的梳理,也不知道讲清楚没有。 若有不足,还请指正~svg
参考文献
[1] Raschka S. Python Machine Learning[M]. Packt Publishing, 2015. [2] 周志华. 机器学习 : = Machine learning[M]. 清华大学出版社, 2016.函数