文章目录

  • 1 前言
  • 2 什么是逻辑回归
  • 3 逻辑回归的代价函数
  • 4 利用梯度下降法求参数
  • 5 结束语
  • 6 参考文献

1 前言

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

2 什么是逻辑回归

逻辑回归在某些书中也被称为对数几率回归,明明被叫做回归,却用在了分类问题上,我个人认为这是因为逻辑回归用了和回归类似的方法来解决了分类问题。

假设有一个二分类问题,输出为y∈{0,1}y \in \{0, 1\}y∈{0,1},而线性回归模型产生的预测值为z=wTx+bz = w^Tx + bz=wTx+b是实数值,我们希望有一个理想的阶跃函数来帮我们实现zzz值到0/10/10/1值的转化。

ϕ(z)={0ifz<00.5ifz=01ifz>0\phi (z) = \left\{ \begin{aligned} 0 \quad if \ z < 0 \\ 0.5 \quad if \ z=0 \\ 1 \quad if \ z>0 \end{aligned} \right. ϕ(z)=⎩⎪⎨⎪⎧​0if z<00.5if z=01if z>0​

然而该函数不连续,我们希望有一个单调可微的函数来供我们使用,于是便找到了SigmoidfunctionSigmoid \ functionSigmoid function来替代。

ϕ(z)=11+e−z\phi (z) = \dfrac{1}{1 + e^{-z}}ϕ(z)=1+e−z1​

两者的图像如下图所示(图片出自文献2)

图1:sigmoid & step function

有了SigmoidfuctionSigmoid \ fuctionSigmoid fuction之后,由于其取值在[0,1][0,1][0,1],我们就可以将其视为类111的后验概率估计p(y=1∣x)p(y = 1|x)p(y=1∣x)。说白了,就是如果有了一个测试点xxx,那么就可以用SigmoidfuctionSigmoid \ fuctionSigmoid fuction算出来的结果来当做该点xxx属于类别111的概率大小。

于是,非常自然地,我们把SigmoidfuctionSigmoid \ fuctionSigmoid fuction计算得到的值大于等于0.50.50.5的归为类别111,小于0.50.50.5的归为类别000。

y^={1ifϕ(z)≥0.50otherwise\hat{y} = \left\{ \begin{aligned} 1 \quad if \ \phi (z) \geq 0.5 \\ 0 \quad \quad \ otherwise \end{aligned} \right. y^​={1if ϕ(z)≥0.50 otherwise​

同时逻辑回归与自适应线性网络非常相似,两者的区别在于逻辑回归的激活函数是SigmoidfunctionSigmoid \ functionSigmoid function而自适应线性网络的激活函数是y=xy = xy=x,两者的网络结构如下图所示(图片出自文献1)。

图2:自适应线性网络

图3:逻辑回归网络

3 逻辑回归的代价函数

好了,所要用的几个函数我们都有了,接下来要做的就是根据给定的训练集,把参数www给求出来了。要找参数www,首先就是得把代价函数(cost function)给定义出来,也就是目标函数。

我们第一个想到的自然是模仿线性回归的做法,利用误差平方和来当代价函数。

J(w)=∑i12(ϕ(z(i))−y(i))2J(w) = \sum_{i} \dfrac{1}{2} (\phi(z^{(i)}) - y^{(i)})^2J(w)=i∑​21​(ϕ(z(i))−y(i))2

其中,z(i)=wTx(i)+bz^{(i)} = w^Tx^{(i)} + bz(i)=wTx(i)+b,iii表示第iii个样本点,y(i)y^{(i)}y(i)表示第iii个样本的真实值,ϕ(z(i))\phi(z^{(i)})ϕ(z(i))表示第iii个样本的预测值。

这时,如果我们将ϕ(z(i))=11+e−z(i)\phi (z^{(i)}) = \dfrac{1}{1 + e^{-z^{(i)}}}ϕ(z(i))=1+e−z(i)1​代入的话,会发现这是一个非凸函数,这就意味着代价函数有着许多的局部最小值,这不利于我们的求解。

图4:凸函数和非凸函数

那么我们不妨来换一个思路解决这个问题。前面,我们提到了ϕ(z)\phi(z)ϕ(z)可以视为类111的后验估计,所以我们有

p(y=1∣x;w)=ϕ(wTx+b)=ϕ(z)p(y=1|x;w) = \phi(w^Tx + b)=\phi(z)p(y=1∣x;w)=ϕ(wTx+b)=ϕ(z)

p(y=0∣x;w)=1−ϕ(z)p(y=0|x;w) = 1 - \phi(z)p(y=0∣x;w)=1−ϕ(z)

其中,p(y=1∣x;w)p(y=1|x;w)p(y=1∣x;w)表示给定www,那么xxx点y=1y=1y=1的概率大小。

上面两式可以写成一般形式

p(y∣x;w)=ϕ(z)y(1−ϕ(z))(1−y)p(y|x;w)=\phi(z)^{y}(1 - \phi(z))^{(1-y)}p(y∣x;w)=ϕ(z)y(1−ϕ(z))(1−y)

接下来我们就要用极大似然估计来根据给定的训练集估计出参数www。

L(w)=∏i=1np(y(i)∣x(i);w)=∏i=1n(ϕ(z(i)))y(i)(1−ϕ(z(i)))1−y(i)L(w)=\prod_{i=1}^{n}p(y^{(i)}|x^{(i)};w)=\prod_{i=1}^{n}(\phi(z^{(i)}))^{y^{(i)}}(1-\phi(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)=lnL(w)=∑i=1ny(i)ln(ϕ(z(i)))+(1−y(i))ln(1−ϕ(z(i)))l(w)=lnL(w)=\sum_{i = 1}^n y^{(i)}ln(\phi(z^{(i)})) + (1 - y^{(i)})ln(1-\phi(z^{(i)}))l(w)=lnL(w)=i=1∑n​y(i)ln(ϕ(z(i)))+(1−y(i))ln(1−ϕ(z(i)))

我们现在要求的是使得l(w)l(w)l(w)最大的www。没错,我们的代价函数出现了,我们在l(w)l(w)l(w)前面加个负号不就变成就最小了吗?不就变成我们代价函数了吗?

J(w)=−l(w)=−∑i=1ny(i)ln(ϕ(z(i)))+(1−y(i))ln(1−ϕ(z(i)))J(w)=-l(w)=-\sum_{i = 1}^n y^{(i)}ln(\phi(z^{(i)})) + (1 - y^{(i)})ln(1-\phi(z^{(i)}))J(w)=−l(w)=−i=1∑n​y(i)ln(ϕ(z(i)))+(1−y(i))ln(1−ϕ(z(i)))

为了更好地理解这个代价函数,我们不妨拿一个例子的来看看

J(ϕ(z),y;w)=−yln(ϕ(z))−(1−y)ln(1−ϕ(z))J(\phi(z),y;w)=-yln(\phi(z))-(1-y)ln(1-\phi(z))J(ϕ(z),y;w)=−yln(ϕ(z))−(1−y)ln(1−ϕ(z))

也就是说

J(ϕ(z),y;w)={−ln(ϕ(z))ify=1−ln(1−ϕ(z))ify=0J(\phi(z),y;w)=\begin{cases} -ln(\phi(z)) & if \ y=1 \\ -ln(1-\phi(z)) & if \ y=0 \end{cases}J(ϕ(z),y;w)={−ln(ϕ(z))−ln(1−ϕ(z))​if y=1if y=0​

我们来看看这是一个怎么样的函数

图5:代价函数

从图中不难看出,如果样本的值是111的话,估计值ϕ(z)\phi(z)ϕ(z)越接近111付出的代价就越小,反之越大;同理,如果样本的值是000的话,估计值ϕ(z)\phi(z)ϕ(z)越接近000付出的代价就越小,反之越大。

4 利用梯度下降法求参数

在开始梯度下降之前,要这里插一句,sigmoidfunctionsigmoid \ functionsigmoid function有一个很好的性质就是

ϕ′(z)=ϕ(z)(1−ϕ(z))\phi'(z) = \phi(z)(1 - \phi(z))ϕ′(z)=ϕ(z)(1−ϕ(z))

下面会用到这个性质。

还有,我们要明确一点,梯度的负方向就是代价函数下降最快的方向。什么?为什么?好,我来说明一下。借助于泰特展开,我们有

f(x+δ)−f(x)≈f′(x)⋅δf(x + \delta) - f(x) \approx f'(x) \cdot \deltaf(x+δ)−f(x)≈f′(x)⋅δ

其中,f′(x)f'(x)f′(x)和δ\deltaδ为向量,那么这两者的内积就等于

f′(x)⋅δ=∣∣f′(x)∣∣⋅∣∣δ∣∣⋅cosθf'(x) \cdot \delta = ||f'(x)|| \cdot ||\delta|| \cdot cos \thetaf′(x)⋅δ=∣∣f′(x)∣∣⋅∣∣δ∣∣⋅cosθ

当θ=π\theta=\piθ=π时,也就是δ\deltaδ在f′(x)f'(x)f′(x)的负方向上时,取得最小值,也就是下降的最快的方向了~

okay?好,坐稳了,我们要开始下降了。

w:=w+Δw,Δw=−η∇J(w)w := w + \Delta w, \ \Delta w=-\eta \nabla J(w)w:=w+Δw, Δw=−η∇J(w)

没错,就是这么下降。没反应过来?那我再写详细一些

wj:=wj+Δwj,Δwj=−η∂J(w)∂wjw_j := w_j + \Delta w_j,\ \Delta w_j = -\eta \dfrac{\partial J(w)}{\partial w_j} wj​:=wj​+Δwj​, Δwj​=−η∂wj​∂J(w)​

其中,wjw_jwj​表示第jjj个特征的权重;η\etaη为学习率,用来控制步长。

重点来了。

∂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)\begin{aligned} & \dfrac{\partial J(w)}{w_j} = -\sum_{i=1}^n (y^{(i)}\dfrac{1}{\phi(z^{(i)})}-(1 - y^{(i)})\dfrac{1}{1-\phi(z^{(i)})})\dfrac{\partial \phi(z^{(i)})}{\partial w_j} \\ & =-\sum_{i=1}^n (y^{(i)}\dfrac{1}{\phi(z^{(i)})}-(1 - y^{(i)})\dfrac{1}{1-\phi(z^{(i)})})\phi(z^{(i)})(1-\phi(z^{(i)}))\dfrac{\partial z^{(i)}}{\partial w_j} \\ & =-\sum_{i=1}^n (y^{(i)}(1-\phi(z^{(i)}))-(1-y^{(i)})\phi(z^{(i)}))x_j^{(i)} \\ & =-\sum_{i=1}^n (y^{(i)}-\phi(z^{(i)}))x_j^{(i)} \end{aligned} ​wj​∂J(w)​=−i=1∑n​(y(i)ϕ(z(i))1​−(1−y(i))1−ϕ(z(i))1​)∂wj​∂ϕ(z(i))​=−i=1∑n​(y(i)ϕ(z(i))1​−(1−y(i))1−ϕ(z(i))1​)ϕ(z(i))(1−ϕ(z(i)))∂wj​∂z(i)​=−i=1∑n​(y(i)(1−ϕ(z(i)))−(1−y(i))ϕ(z(i)))xj(i)​=−i=1∑n​(y(i)−ϕ(z(i)))xj(i)​​

所以,在使用梯度下降法更新权重时,只要根据下式即可

wj:=wj+η∑i=1n(y(i)−ϕ(z(i)))xj(i)w_j :=w_j+\eta \sum_{i=1}^n (y^{(i)}-\phi(z^{(i)}))x_j^{(i)}wj​:=wj​+ηi=1∑n​(y(i)−ϕ(z(i)))xj(i)​

此式与线性回归时更新权重用的式子极为相似,也许这也是逻辑回归要在后面加上回归两个字的原因吧。

当然,在样本量极大的时候,每次更新权重会非常耗费时间,这时可以采用随机梯度下降法,这时每次迭代时需要将样本重新打乱,然后用下式不断更新权重。

wj:=wj+η(y(i)−ϕ(z(i)))xj(i),foriinrange(n)w_j := w_j + \eta (y^{(i)}-\phi(z^{(i)}))x_j^{(i)}, for \ i \ in \ range(n) wj​:=wj​+η(y(i)−ϕ(z(i)))xj(i)​,for i in range(n)

也就是去掉了求和,而是针对每个样本点都进行更新。

5 结束语

以上就是我参考了基本书中的说法之后对逻辑回归整个推到过程的梳理,也不知道讲清楚没有。
如有不足,还请指正~

6 参考文献

[1] Raschka S. Python Machine Learning[M]. Packt Publishing, 2015.
[2] 周志华. 机器学习 : = Machine learning[M]. 清华大学出版社, 2016.

逻辑回归(logistic regression)的本质——极大似然估计相关推荐

  1. Coursera公开课笔记: 斯坦福大学机器学习第六课“逻辑回归(Logistic Regression)”

    Coursera公开课笔记: 斯坦福大学机器学习第六课"逻辑回归(Logistic Regression)" 斯坦福大学机器学习第六课"逻辑回归"学习笔记,本次 ...

  2. 斯坦福大学机器学习第四课“逻辑回归(Logistic Regression)”

    斯坦福大学机器学习第四课"逻辑回归(Logistic Regression)" 本次课程主要包括7部分: 1) Classification(分类) 2) Hypothesis R ...

  3. 逻辑回归(Logistic Regression, LR)又称为逻辑回归分析,是分类和预测算法中的一种。通过历史数据的表现对未来结果发生的概率进行预测。例如,我们可以将购买的概率设置为因变量,将用户的

    逻辑回归(Logistic Regression, LR)又称为逻辑回归分析,是分类和预测算法中的一种.通过历史数据的表现对未来结果发生的概率进行预测.例如,我们可以将购买的概率设置为因变量,将用户的 ...

  4. CS229学习笔记(3)逻辑回归(Logistic Regression)

    1.分类问题 你要预测的变量yyy是离散的值,我们将学习一种叫做逻辑回归 (Logistic Regression) 的算法,这是目前最流行使用最广泛的一种学习算法. 从二元的分类问题开始讨论. 我们 ...

  5. 札记_ML——《统计学习方法》逻辑回归logistic regression)

    统计学习方法:五. 逻辑回归logistic regression 逻辑回归logistic regression Logistic的起源 1).概念logistic回归又称logistic回归分析, ...

  6. 逻辑回归(Logistic Regression)简介及C++实现

    逻辑回归(Logistic Regression):该模型用于分类而非回归,可以使用logistic sigmoid函数( 可参考:http://blog.csdn.net/fengbingchun/ ...

  7. OpenCV3.3中逻辑回归(Logistic Regression)使用举例

    OpenCV3.3中给出了逻辑回归(logistic regression)的实现,即cv::ml::LogisticRegression类,类的声明在include/opencv2/ml.hpp文件 ...

  8. OpenCV逻辑回归Logistic Regression的实例(附完整代码)

    OpenCV逻辑回归Logistic Regression的实例 OpenCV逻辑回归Logistic Regression的实例 OpenCV逻辑回归Logistic Regression的实例 # ...

  9. 机器学习笔记04:逻辑回归(Logistic regression)、分类(Classification)

    之前我们已经大概学习了用线性回归(Linear Regression)来解决一些预测问题,详见: 1.<机器学习笔记01:线性回归(Linear Regression)和梯度下降(Gradien ...

最新文章

  1. C++设计模式——适配器模式(对象适配器、类适配器)
  2. Java NIO:IO与NIO的区别
  3. 《中国管理安全服务(MSS)市场研究报告2010》读后感
  4. JAVA 排序工具类
  5. X-Frame-Options 配置
  6. acer清理工具 clear下载_免流量工具聚合下载,包含全部工具
  7. 计算机科学文学学士,波士顿大学计算机科学.pdf
  8. ios上传图片遇见了一个TimeoutError(DOM Exception 23)异常
  9. 浅浅分析滤波器截止频率
  10. 直播预告 | NeurIPS 专场一 青年科学家专场
  11. soot基础 -- 常用参数配置
  12. 获取VM中win10虚拟机映像
  13. Linux修改文件时间或创建新文件:touch
  14. 怎样查询今天是属于一年中的第几周?ww和iw 的周别问题。
  15. 实战 | flink sql 实时 TopN
  16. 通通通2006+浩方打星际问题
  17. 联通大数据5000台规模集群故障自愈实践
  18. redhat 9.0 制作openssh rpm包(9.0p1/9.1/9.2/9.3 p1) —— 筑梦之路
  19. 移动魔百盒M301H 刷机固件及教程
  20. 电脑充电器,笔记本充电器都见过,但这些猫腻我不说你知道吗

热门文章

  1. javaweb不同用户需要几张表_程序员必备2020版:JavaWeb快速进阶全套教程
  2. 电脑老是弹出vrvedp_m_出现三个可疑进程vrvedp_m.exe vrvrf_c.exe vrvsafec.exe
  3. python爬取网易云歌单_详解python selenium 爬取网易云音乐歌单名
  4. Linux中chown和chmod的区别和用法
  5. oracle数据库更新语句_20_手把手教你学Python之操作数据库
  6. VS2010断点设置技巧
  7. 用计算机计算出密码,自带计算器的密码
  8. Win10/Win7小技巧:教你如何彻底关闭系统进程
  9. sqlite4java下载_使用sqlite4java的UnsatisfiedLinkError,没有sqlite4java-osx-amd64
  10. amd cpu不能在cmd环境下运行java代码_「我们一起学Java02」JDK、JRE、JVM简介,Java开发平台的搭建...