当前位置: 首页 > news >正文

【机器学习】逻辑回归

一、什么是逻辑回归

        逻辑回归并不是解决回归任务的,而是常用于解决二分类任务的。

        逻辑回归是最简单的机器学习算法,但这并不意味着它是最没用的。因为像神经网络这种复杂的机器学习算法,一是会消耗时间计算机资源,二是过于强大而导致提高了过拟合风险(计算机容易学死),对于所有问题并不是用神经网络的效果一定比简单的算法效果好。所以选择机器学习算法时,是先选择简单的,效果不行的情况下,再选择复杂的。因此,逻辑回归通常是作为基准模型,是最常用到的机器学习算法

        逻辑回归的决策边界可以是非线性的,形象地说,将两个类别分开的线可以是直线(线性),也可以是弯曲的线类似下图所示(非线性)。

二、Sigmoid函数

        将回归任务转换为分类任务,需要将预测值(预测的实际数值)转换为概率值(属于当前类别的概率),即0~1的数值,这个转换用Sigmoid函数实现。公式如下:

g\left ( z \right )=\frac{1}{1+e^{-z}}                                                  式(1)

        函数图像如下:

三、预测函数

       将预测函数带入式(1)得到:

       h_{\theta }\left ( x \right )=g\left ( \theta ^{T}x \right )=\frac{1}{1+e^{-\theta ^{T}x}},其中\theta ^{Tx}=\sum_{i=1}^{n}\theta _{i}x_{i}=\theta _{0}+\theta _{1}x_{1}+,......,+\theta _{n}x_{n},i 表示第 i 个特征。 

        二分类任务中真值1表示属于该类,真值0表示不属于该类,分别对应的预测函数为:

        P\left ( y=1|x;\theta \right )=h_{\theta }\left ( x \right )                                       式(2)

        P\left ( y=0|x;\theta \right )=1-h_{\theta }\left ( x \right )                                   式(3)

       但这样分开求损失函数计算权重,并不方便,因此需要合并,得到最终的预测函数

       P(y|x;\theta)=(h_\theta(x))^\mathrm{y}(1-h_\theta(x))^\mathrm{l-y},当y=1,变成式(2);当y=0,变成式(3)。

        然后接着做极大似然估计,似然函数

        L(\theta)=\prod_{i=1}^{m}P(y_i\mid x_i;\theta)=\prod_{i-1}^m(h_\theta(x_i))^{y_i}(1-h_\theta(x_i))^{1-y_i},其中 i 表

示第 i 个样本。

        似然函数取对数

        l(\theta)=\log L(\theta)=\sum_{i=1}^{m}\left(y_{i}\log h_{\theta}(x_{i})+(1-y_{i})\log(1-h_{\theta}(x_{i}))\right),其中i表示第 i 个样本。

        但是在反向传播中,我们通常习惯于做梯度下降任务,因为这符合逻辑上的将损失降到最小,因此将取对数的结果再加上负号,把梯度上升问题改为了梯度下降问题。除以m是取损失的平均值,得到了二分类交叉熵

        J(\theta)=-\frac1m\sum_{i=1}^{m}\left(y_{i}\log h_{\theta}(x_{i})+(1-y_{i})\log(1-h_{\theta}(x_{i}))\right),其中 i 表示第 i 个样本,m表示样本总数。二分类交叉熵是一种损失函数,是交叉熵的一个特例,常与Sigmoid激活函数搭配使用,处理二分类问题。想用逻辑回归解决多分类问题,需要用Softmax激活函数和交叉熵损失函数。

        求导过程(不重要,我们只需要知道结果):

\begin{aligned}&\frac{\delta}{\delta\theta_{j}}J(\theta)=-\frac{1}{m}\sum_{i=1}^{m}\Big(\:y_{i}\:\frac{1}{h_{\theta}(x_{i})}\:\frac{\delta}{\delta\theta_{j}}h_{\theta}(x_{i})-(1-y_{i})\:\frac{1}{1-h_{\theta}(x_{i})}\:\frac{\delta}{\delta\theta_{j}}h_{\theta}(x_{i})\Big)\\&=-\frac{1}{m}\sum_{i=1}^{m}\Big(\:y_{i}\:\frac{1}{g(\theta^{\mathrm{T}}x_{i})}-(1-y_{i})\:\frac{1}{1-g(\theta^{\mathrm{T}}x_{i})}\Big)\frac{\delta}{\delta\theta_{j}}g(\theta^{\mathrm{T}}x_{i})\\&==-\frac{1}{m}\sum_{i=1}^{m}\Bigg( y_{i} \frac{1}{g(\theta^{\mathrm{T}}x_{i})}-(1-\mathrm{y}_{\mathrm{i}})\frac{1}{1-g(\theta^{\mathrm{T}}x_{i})}\Bigg)g(\theta^{\mathrm{T}}x_{i})(1-g(\theta^{\mathrm{T}}x_{i}))\frac{\delta}{\delta\theta_{j}}\theta^{\mathrm{T}}x_{i}\\&=-\frac{1}{m}\sum_{i=1}^{m}\Big(\:y_{i}\:(1-g(\theta^{\mathrm{T}}x_{i}))-(1-y_{i})g(\theta^{\mathrm{T}}x_{i})\Big)x_{i}^{j}\\&=-\frac{1}{m}\sum_{i=1}^{m}\Big(y_{i}-g(\theta^{\mathrm{T}}x_{i})\Big)x_{i}^{j}\\&=\frac{1}{m}\sum_{i=1}^{m}(h_{\theta}(x_{i})-y_{i})x_{i}^{j}\end{aligned}

        其中,i 表示第 i 个样本,j 表示第 j 个特征,最后要把求得梯度反向才是梯度下降的方向。

        参数更新\theta_{j}=\theta_{j} +\alpha\frac{1}{m}\sum_{i=1}^{m}\bigl(y_{i}-h_{\theta}(x_{i})\bigr)x_{i}^{j}

四、总结

        基本上所有的分类问题都可以用逻辑回归解决。它的求解速度快;模型可解释性强,很多参数都有物理含义,便于我们理解,比如大的\theta表示特征重要,小的\theta表示特征不重要。但是像神经网络、支持向量机这种复杂的算法,它计算得到的很多参数都是没有物理意义的,只是求得的结果有用而已,不利于理解。因此,拿到任务后建议先用逻辑回归试一下,不行再考虑一些复杂的算法。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ArcGIS Pro基础:如何将数据和引用地图样式一起打包分享
  • leetcode53:最大子数组和
  • Neo4J下载安装
  • 宿州申报!宿州市首台套重大技术装备申报奖补条件
  • 39-nacos eureka zookeeper区别
  • 飞书应用机器人文件上传
  • 【C++】12.智能指针
  • Jupyter Notebook 使用多个Kernel
  • 技术文档索引
  • Linux 内核源码分析---组播/策略路由选择
  • 内存函数memcpy和memmove
  • 谷歌chrome浏览器显示“版本太旧”又无法更新情况下,如何关闭“Chrome版本太旧”提示,包括直接启动Google浏览器,或者通过其他应用启动
  • Web层统一实体规范封装
  • 出现 2003 - Can’t connect to MySQL server on ‘xxx‘(10060) 解决方法
  • 3b1b自注意力机制讲解记录
  • 【Linux系统编程】快速查找errno错误码信息
  • JavaScript-Array类型
  • js
  • Netty 4.1 源代码学习:线程模型
  • Netty源码解析1-Buffer
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • PAT A1120
  • Solarized Scheme
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 高程读书笔记 第六章 面向对象程序设计
  • 简析gRPC client 连接管理
  • 将 Measurements 和 Units 应用到物理学
  • 深度学习在携程攻略社区的应用
  • 《码出高效》学习笔记与书中错误记录
  • Java总结 - String - 这篇请使劲喷我
  • MyCAT水平分库
  • Nginx实现动静分离
  • Python 之网络式编程
  • ​io --- 处理流的核心工具​
  • # Panda3d 碰撞检测系统介绍
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #Linux(权限管理)
  • #pragma pack(1)
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (C++17) std算法之执行策略 execution
  • (javascript)再说document.body.scrollTop的使用问题
  • (第二周)效能测试
  • (函数)颠倒字符串顺序(C语言)
  • (十八)三元表达式和列表解析
  • (学习日记)2024.01.19
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)项目管理杂谈-我所期望的新人
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET 漏洞分析 | 某ERP系统存在SQL注入
  • :=
  • @JSONField或@JsonProperty注解使用
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——
  • [④ADRV902x]: Digital Filter Configuration(发射端)