逻辑回归

转载至https://blog.csdn.net/zjuPeco/article/details/77165974

前言
逻辑回归是分类当中极为常用的手段,因此,掌握其内在原理是非常必要的。我会争取在本文中尽可能简明地展现逻辑回归(logistic regression)的整个推导过程。

什么是逻辑回归
逻辑回归在某些书中也被称为对数几率回归,明明被叫做回归,却用在了分类问题上,我个人认为这是因为逻辑回归用了和回归类似的方法来解决了分类问题。 
假设有一个二分类问题,输出为y∈{0,1}y∈{0,1},而线性回归模型产生的预测值为z=wTx+bz=wTx+b是实数值,我们希望有一个理想的阶跃函数来帮我们实现zz值到0/10/1值的转化。 
ϕ(z)=⎧⎩⎨⎪⎪00.51if z < 0if z = 0if z > 0ϕ(z)={0if z < 00.5if z = 01if z > 0
然而该函数不连续,我们希望有一个单调可微的函数来供我们使用,于是便找到了Sigmoid functionSigmoid function来替代。 
ϕ(z)=11+e−zϕ(z)=11+e−z
两者的图像如下图所示(图片出自文献2) 


图1:sigmoid & step function

有了Sigmoid fuctionSigmoid fuction之后,由于其取值在[0,1][0,1],我们就可以将其视为类11的后验概率估计p(y=1|x)p(y=1|x)。说白了,就是如果有了一个测试点xx,那么就可以用Sigmoid fuctionSigmoid fuction算出来的结果来当做该点xx属于类别11的概率大小。 
于是,非常自然地,我们把Sigmoid fuctionSigmoid fuction计算得到的值大于等于0.50.5的归为类别11,小于0.50.5的归为类别00。 
ŷ ={10if ϕ(z)≥0.5otherwisey^={1if ϕ(z)≥0.50otherwise
同时逻辑回归与自适应线性网络非常相似,两者的区别在于逻辑回归的激活函数是Sigmoid functionSigmoid function而自适应线性网络的激活函数是y=xy=x,两者的网络结构如下图所示(图片出自文献1)。 


图2:自适应线性网络

图3:逻辑回归网络
逻辑回归的代价函数
好了,所要用的几个函数我们都有了,接下来要做的就是根据给定的训练集,把参数ww给求出来了。要找参数ww,首先就是得把代价函数(cost function)给定义出来,也就是目标函数。 
我们第一个想到的自然是模仿线性回归的做法,利用误差平方和来当代价函数。 
J(w)=∑i12(ϕ(z(i))−y(i))2J(w)=∑i12(ϕ(z(i))−y(i))2
其中,z(i)=wTx(i)+bz(i)=wTx(i)+b,ii表示第ii个样本点,y(i)y(i)表示第ii个样本的真实值,ϕ(z(i))ϕ(z(i))表示第ii个样本的预测值。 
这时,如果我们将ϕ(z(i))=11+e−z(i)ϕ(z(i))=11+e−z(i)代入的话,会发现这是一个非凸函数,这就意味着代价函数有着许多的局部最小值,这不利于我们的求解。 


图4:凸函数和非凸函数

那么我们不妨来换一个思路解决这个问题。前面,我们提到了ϕ(z)ϕ(z)可以视为类11的后验估计,所以我们有 
p(y=1|x;w)=ϕ(wTx+b)=ϕ(z)p(y=1|x;w)=ϕ(wTx+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)表示给定ww,那么xx点y=1y=1的概率大小。 
上面两式可以写成一般形式 
p(y|x;w)=ϕ(z)y(1−ϕ(z))(1−y)p(y|x;w)=ϕ(z)y(1−ϕ(z))(1−y)
接下来我们就要用极大似然估计来根据给定的训练集估计出参数ww。 
L(w)=∏ni=1p(y(i)|x(i);w)=∏ni=1(ϕ(z(i)))y(i)(1−ϕ(z(i)))1−y(i)L(w)=∏i=1np(y(i)|x(i);w)=∏i=1n(ϕ(z(i)))y(i)(1−ϕ(z(i)))1−y(i)
为了简化运算,我们对上面这个等式的两边都取一个对数 
l(w)=lnL(w)=∑ni=1y(i)ln(ϕ(z(i)))+(1−y(i))ln(1−ϕ(z(i)))l(w)=lnL(w)=∑i=1ny(i)ln(ϕ(z(i)))+(1−y(i))ln(1−ϕ(z(i)))
我们现在要求的是使得l(w)l(w)最大的ww。没错,我们的代价函数出现了,我们在l(w)l(w)前面加个负号不就变成就最小了吗?不就变成我们代价函数了吗? 
J(w)=−l(w)=−∑ni=1y(i)ln(ϕ(z(i)))+(1−y(i))ln(1−ϕ(z(i)))J(w)=−l(w)=−∑i=1ny(i)ln(ϕ(z(i)))+(1−y(i))ln(1−ϕ(z(i)))
为了更好地理解这个代价函数,我们不妨拿一个例子的来看看 
J(ϕ(z),y;w)=−yln(ϕ(z))−(1−y)ln(1−ϕ(z))J(ϕ(z),y;w)=−yln(ϕ(z))−(1−y)ln(1−ϕ(z))
也就是说 
J(ϕ(z),y;w)={−ln(ϕ(z))−ln(1−ϕ(z))if y=1if y=0J(ϕ(z),y;w)={−ln(ϕ(z))if y=1−ln(1−ϕ(z))if y=0
我们来看看这是一个怎么样的函数 


图5:代价函数

从图中不难看出,如果样本的值是11的话,估计值ϕ(z)ϕ(z)越接近11付出的代价就越小,反之越大;同理,如果样本的值是00的话,估计值ϕ(z)ϕ(z)越接近00付出的代价就越小,反之越大。
利用梯度下降法求参数
在开始梯度下降之前,要这里插一句,sigmoid functionsigmoid function有一个很好的性质就是 
ϕ′(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)||⋅||δ||⋅cosθf′(x)⋅δ=||f′(x)||⋅||δ||⋅cosθ
当θ=πθ=π时,也就是δδ在f′(x)f′(x)的负方向上时,取得最小值,也就是下降的最快的方向了~ 
okay?好,坐稳了,我们要开始下降了。 
w:=w+Δw, Δw=−η∇J(w)w:=w+Δw, Δw=−η∇J(w)
没错,就是这么下降。没反应过来?那我再写详细一些 
wj:=wj+Δwj, Δwj=−η∂J(w)∂wjwj:=wj+Δwj, Δwj=−η∂J(w)∂wj
其中,wjwj表示第jj个特征的权重;ηη为学习率,用来控制步长。 
重点来了。 
∂J(w)wj=−∑ni=1(y(i)1ϕ(z(i))−(1−y(i))11−ϕ(z(i)))∂ϕ(z(i))∂wj=−∑ni=1(y(i)1ϕ(z(i))−(1−y(i))11−ϕ(z(i)))ϕ(z(i))(1−ϕ(z(i)))∂z(i)∂wj=−∑ni=1(y(i)(1−ϕ(z(i)))−(1−y(i))ϕ(z(i)))x(i)j=−∑ni=1(y(i)−ϕ(z(i)))x(i)j∂J(w)wj=−∑i=1n(y(i)1ϕ(z(i))−(1−y(i))11−ϕ(z(i)))∂ϕ(z(i))∂wj=−∑i=1n(y(i)1ϕ(z(i))−(1−y(i))11−ϕ(z(i)))ϕ(z(i))(1−ϕ(z(i)))∂z(i)∂wj=−∑i=1n(y(i)(1−ϕ(z(i)))−(1−y(i))ϕ(z(i)))xj(i)=−∑i=1n(y(i)−ϕ(z(i)))xj(i)
所以,在使用梯度下降法更新权重时,只要根据下式即可 
wj:=wj+η∑ni=1(y(i)−ϕ(z(i)))x(i)jwj:=wj+η∑i=1n(y(i)−ϕ(z(i)))xj(i)
此式与线性回归时更新权重用的式子极为相似,也许这也是逻辑回归要在后面加上回归两个字的原因吧。 
当然,在样本量极大的时候,每次更新权重会非常耗费时间,这时可以采用随机梯度下降法,这时每次迭代时需要将样本重新打乱,然后用下式不断更新权重。 
wj:=wj+η(y(i)−ϕ(z(i)))x(i)j,for i in range(n)wj:=wj+η(y(i)−ϕ(z(i)))xj(i),for i in range(n)
也就是去掉了求和,而是针对每个样本点都进行更新。
结束语
以上就是我参考了基本书中的说法之后对逻辑回归整个推到过程的梳理,也不知道讲清楚没有。 
如有不足,还请指正~

参考文献
[1] Raschka S. Python Machine Learning[M]. Packt Publishing, 2015. 
[2] 周志华. 机器学习 : = Machine learning[M]. 清华大学出版社, 2016.
--------------------- 
作者:zjuPeco 
来源:CSDN 
原文:https://blog.csdn.net/zjuPeco/article/details/77165974?utm_source=copy 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值