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

文章目录

  • 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+ez1

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

图1:sigmoid & step function

有了SigmoidfuctionSigmoid \ fuctionSigmoid fuction之后,由于其取值在[0,1][0,1][0,1],我们就可以将其视为类111的后验概率估计p(y=1∣x)p(y = 1|x)p(y=1x)。说白了,就是如果有了一个测试点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)。

adaline

图2:自适应线性网络

logisticRegression

图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)=i21(ϕ(z(i))y(i))2

其中,z(i)=wTx(i)+bz^{(i)} = w^Tx^{(i)} + bz(i)=wTx(i)+biii表示第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+ez(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=1x;w)=ϕ(wTx+b)=ϕ(z)

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

其中,p(y=1∣x;w)p(y=1|x;w)p(y=1x;w)表示给定www,那么xxxy=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(yx;w)=ϕ(z)y(1ϕ(z))(1y)

接下来我们就要用极大似然估计来根据给定的训练集估计出参数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=1np(y(i)x(i);w)=i=1n(ϕ(z(i)))y(i)(1ϕ(z(i)))1y(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=1ny(i)ln(ϕ(z(i)))+(1y(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=1ny(i)ln(ϕ(z(i)))+(1y(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))(1y)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

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

costfunction

图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=ηwjJ(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} wjJ(w)=i=1n(y(i)ϕ(z(i))1(1y(i))1ϕ(z(i))1)wjϕ(z(i))=i=1n(y(i)ϕ(z(i))1(1y(i))1ϕ(z(i))1)ϕ(z(i))(1ϕ(z(i)))wjz(i)=i=1n(y(i)(1ϕ(z(i)))(1y(i))ϕ(z(i)))xj(i)=i=1n(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=1n(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.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470778.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用mongoose 在 Node中操作MongoDB数据库

MongoDB 关系型和非关系型数据库 关系型数据库&#xff08;表就是关系&#xff0c;或者说表与表之间存在关系&#xff09;。 所有的关系型数据库都需要通过sql语言来操作所有的关系型数据库在操作之前都需要设计表结构而且数据表还支持约束 唯一的主键默认值非空 非关系型…

pip install时发生raise ReadTimeoutError(self._pool, None, 'Read timed out.')的解决方案

问题描述 在windows下&#xff0c;python在安装一些包的时候&#xff0c;常常会碰到time out的情况&#xff0c;如下图所示。不管再重试几次都是如此&#xff0c;这时候该怎么办呢&#xff1f; 解决方案 方案一&#xff1a;更换安装源&#xff08;推荐使用豆瓣源&#xff09…

使用Node 操作MySQL数据库

1. 安装 官方文档&#xff1a;https://www.npmjs.com/package/mysql npm install --save mysql2.代码演示 var mysql require(mysql);// 1.创建连接 var connection mysql.createConnection({host : localhost,user : root,password : root,database : my_db …

利用随机森林对特征重要性进行评估

文章目录1 前言2 随机森林&#xff08;RF&#xff09;简介3 特征重要性评估4 举个例子5 参考文献1 前言 随机森林是以决策树为基学习器的集成学习算法。随机森林非常简单&#xff0c;易于实现&#xff0c;计算开销也很小&#xff0c;更令人惊奇的是它在分类和回归上表现出了十…

Promise学习——解决回调地狱问题

Promise promise 容器概念&#xff1a; callback hell&#xff08;回调地狱&#xff09;: 文件的读取无法判断执行顺序&#xff08;文件的执行顺序是依据文件的大小来决定的&#xff09;(异步api无法保证文件的执行顺序) var fs require(fs);fs.readFile(./data/a.text,ut…

基于哈希表的索引堆变形(Hackerrank: QHEAP1)

问题来源 此题来自于Hackerrank中的QHEAP1问题&#xff0c;考查了对堆结构的充分理解。成功完成此题&#xff0c;对最大堆或者最小堆的基本操作实现就没什么太大问题了。 问题简述 实现一个最小堆&#xff0c;对3种类型的输入能给出正确的操作&#xff1a; “1 v” - 表示往…

Node 中的path模块

参考文档&#xff1a;https://nodejs.org/docs/latest-v13.x/api/path.html path模块中的常用API&#xff1a; path.basename&#xff1a;获取路径的文件名&#xff0c;默认包含扩展名path.dirname&#xff1a;获取路径中的目录部分path.extname&#xff1a;获取一个路径中的扩…

Node中的fs模块

1.fs.stat检测是文件还是目录 2.fs.mkdir创建目录 3.fs.writeFile创建写入文件 4.fs.appendFile追加文件 5.fs.readFile 读取文件 6.fs.readdir读取目录 7.fs.rename重命名 8.fs.rmdir删除目录 9.fs.unlink 删除文件 fs.stat 检测是文件还是目录 const fs require(fs)fs.stat…

主成分分析(PCA)和基于核函数的主成分分析(KPCA)入门

文章目录1 前言2 PCA的原理2.1 什么是投影2.2 投影后的方差2.3 转化为求特征值的问题2.4 符号的表示3 KPCA的原理4 PCA和KPCA在Python中的使用4.1 PCA的使用4.2 KPCA的使用5 参考文献1 前言 主成分分析是在做特征筛选时的重要手段&#xff0c;这个方法在大部分的书中都只是介绍…

算法分类整理+模板①:矩阵快速幂

一直有一个想法&#xff0c;感觉自己很多基础算法不是很扎实&#xff0c;想要找个机会写一些算法的整理&#xff0c;顺便自己总结一些实用的模板。 最近偶然在训练赛中连续做了2道思维矩阵快速幂的题目&#xff0c;碰巧有时间&#xff0c;就以矩阵快速幂作为这个系列博客的开始…

爬虫小记:利用cookies跳过登陆验证码

前言 在爬取某些网页时&#xff0c;登陆界面时经常遇到的一个坎&#xff0c;而现在大多数的网站在登陆时都会要求用户填写验证码。当然&#xff0c;我们可以设计一套机器学习的算法去破解验证码&#xff0c;然而&#xff0c;验证码的形式多种多样&#xff0c;稍微变一下&#…

Nodejs 中的包、npm 、第三方模块、 package.json 以及 cnpm

一、包与 NPM 包Nodejs 中除了它自己提供的核心模块外&#xff0c;我们可以自定义模块&#xff0c;也可以使用第三方的 模块。Nodejs 中第三方模块由包组成&#xff0c;可以通过包来对一组具有相互依赖关系的模块进行 统一管理。 完全符合 CommonJs 规范的包目录一般包含如下…

神经网络中BP(back propagation)到底在干些什么

前言 想要理解神经网络的工作原理&#xff0c;反向传播(BP)是必须搞懂的东西。BP其实并不难理解&#xff0c;说白了就是用链式法则(chain rule)算算算。本文试图以某个神经网络为例&#xff0c;尽可能直观&#xff0c;详细&#xff0c;明了地说明反向传播的整个过程。 正向传…

Nodejs 新特性 async await 的使用 以及使用 async await 处理异步

1. let 和 var 2. const定义常量 3. 模板字符串 4. 属性简写 5. 方法简写 6. 箭头函数 7. 回调函数 7. Promise 8. async 和 await

leetcode 高薪_LeetCode 第 125 号问题:验证回文串

本文首发于公众号「五分钟学算法」&#xff0c;是图解 LeetCode 系列文章之一。个人网站&#xff1a;https://www.cxyxiaowu.com题目来源于 LeetCode 第 125 号问题&#xff1a;验证回文串。这道题目是 初级程序员 在面试的时候经常遇到的一道算法题&#xff0c;而且面试官喜欢…

从拉格朗日乘子法到SVM

前言 本文主要是讲了如何构建SVM的模型&#xff0c;并利用KKT条件构造其对偶型&#xff0c;从而求解问题&#xff0c;并讲述了SVM的硬间隔&#xff0c;软间隔和核函数三个境界。主要参考了周志华的《机器学习》&#xff0c;并在其中补充了自己的想法。由于内容较多&#xff0c…

nodejs 创建一个静态资源服务器 +路由

0、补充 1、Node.js 创建的第一个应用 1、引入 http 模块 var http require("http"); 2、创建服务器 接下来我们使用 http.createServer() 方法创建服务器&#xff0c;并使用 listen 方法绑定 3000 端口。 函数通过 request, response 参数来接收和响应数据。 co…

python输出字体的大小_Python密码学编程:文件的加密与解密

在之前的章节中&#xff0c;编写的程序只能操作较少的信息&#xff0c;这些信息往往是以字符串的形式直接写在代码中的。但本章中的程序可以对整个文件进行加密和解密&#xff0c;文件的大小可以包括成千上万个字符。本章要点open()方法。读、写文件。write()、close()及read()…

电脑k歌软件_金麦客专业k歌app下载|金麦客专业k歌软件 手机安卓版v1.1.5.0 下载...

金麦客专业k歌app能够让用户通过手机直接连接电视&#xff0c;从而在安卓端实现金麦客点歌的目的&#xff0c;平台包含上万高清mv资源&#xff0c;让用户在歌唱时能够更好的代入氛围中&#xff0c;并且还能通过网络直接搜歌&#xff0c;从而在线下载播放&#xff0c;用户在演唱…

Nodejs ejs模板引擎

官方网站&#xff1a;https://www.npmjs.com/package/ejs 我们学的 EJS 是后台模板&#xff0c;可以把我们数据库和文件读取的数据显示到 Html 页面上面。它 是一个第三方模块&#xff0c;需要通过 npm 安装 npm install ejs –save 或者 cnpm install ejs --saveNodejs 中使用…