机器学习04-逻辑回归(python)-02原理与损失函数

​​​​​​​

1. 逻辑回归概念

逻辑回归(Logistic Regression) 是一种 分类模型,主要用于解决 二分类问题(即分成两类,如是否通过、是否患病等)。逻辑回归的目标是根据输入的特征预测一个 概率,这个概率值介于 0 到 1 之间。

逻辑回归与线性回归的关系:
  • 线性回归 是用来预测连续值的(如房价、身高),它输出的是一个具体的数值。

  • 逻辑回归 则是用来预测类别的(如是否通过考试),它通过一个线性模型输出一个概率值,表示某个样本属于某一类别的概率。

总结:
  • 线性回归输出数值,而逻辑回归输出概率

  • 逻辑回归的输出值是 0 到 1 之间的概率,通常我们会设定一个阈值,比如 0.5,将大于 0.5 的归为 1 类,低于 0.5 的归为 0 类。


2. 基本思想

逻辑回归的基本思想,我们可以从以下几个步骤来理解。

Step 1. 线性模型

逻辑回归首先构建的是一个线性模型,即根据输入的特征计算出一个值:[ f(x) = w^T x + b ] 这里的( w ) 是权重向量,表示每个特征的重要性;( b )是偏置项,帮助调整模型的输出。

这个线性模型的输出 ( w^T x + b ) 可以是任何实数(正数、负数、大值、小值都有可能)。但是我们不能直接使用这个值进行分类,因为分类任务需要输出的值在 0 到 1 之间,表示概率。

Step 2. Sigmoid 函数

为了将线性模型的输出值转换为 0 到 1 之间的概率值,逻辑回归使用了 Sigmoid 函数[ \sigma(z) = \frac{1}{1 + e^{-z}} ]其中,( z = w^T x + b )

Sigmoid 函数的作用

  • 将任意实数映射到 0 到 1 之间。例如,当 ( z ) 非常大时,Sigmoid 函数的输出接近 1;当 ( z )非常小时,Sigmoid 函数的输出接近 0。

  • 输出的概率值( \sigma(z) ) 表示样本属于某一类别(通常为 1 类)的概率。

Step 3. 分类预测

逻辑回归的最终目标是对样本进行分类。我们通常通过设定一个 阈值 来判断:

  • 如果 Sigmoid函数的输出概率值大于设定的阈值(如 0.5),则预测该样本属于 1 类

  • 如果小于阈值,则预测该样本属于 0 类

总结:逻辑回归首先通过线性模型计算出一个值,然后将该值通过 Sigmoid 函数转换为概率,最后根据设定的阈值进行分类。


3. 逻辑回归的假设函数

在逻辑回归中,假设函数表示的是模型如何通过输入 ( x ) 得到输出的概率值。假设函数如下:[ h_\theta(x) = \sigma(w^T x + b) ]其中:

  • ( w^T x + b ) 是输入特征的线性组合;

  • ( \sigma(z) ) 是 Sigmoid 函数,用来将线性模型的输出转换为概率值。

通过这个假设函数,我们可以将任何输入特征转换为一个概率值,这个概率值用于表示样本属于某一类的可能性。


4. 逻辑回归的预测过程(PPT中的例子)

看PPT中的例子,假设有一组样本输入特征,逻辑回归的预测过程可以总结为以下几个步骤:

  1. 输入样本特征:如一个人的年龄、体重、是否吸烟等特征。

  2. 线性回归计算:根据权重( w )和偏置( b ),计算出线性回归的结果 ( w^T x + b )

  3. Sigmoid 函数转换:将线性回归的输出通过 Sigmoid 函数转换为概率值。

  4. 分类结果:根据设定的阈值,将概率值转换为预测类别。

举例:

假设有一个样本的输入特征为 ( x = [年龄, 体重, 是否吸烟] ),计算过程如下:

  • 使用权重和特征的线性组合计算出 ( f(x) = w^T x + b ),例如输出为 1.5。

  • 通过 Sigmoid 函数将 1.5 转换为概率 ( \sigma(1.5) = 0.82 )

  • 假设阈值为 0.6,由于 0.82 > 0.6,因此预测该样本属于 1 类


5. 损失函数:对数似然损失

为了衡量逻辑回归模型的好坏,我们需要计算 损失函数。损失函数表示模型的预测值与真实值之间的差距。逻辑回归使用的损失函数是 对数似然损失函数,又称为 交叉熵损失(Cross-Entropy Loss)。其主要作用是用来指导模型更新权重,使得模型的预测越来越接近真实标签。

损失函数的公式如下:

​​​​​​​[ L(\theta) = - \sum_{i=1}^{m} [y_i \log(p_i) + (1 - y_i) \log(1 - p_i)] ]

其中:

  • ( y_i ) 是第 ( i ) 个样本的 真实类别,它的值为 0 或 1。

  • ( p_i ) 是模型预测第 ( i ) 个样本属于 1 类的概率,这个值介于 0 和 1 之间。

目标:我们希望模型预测出的概率 ( p_i) 尽量接近样本的真实类别 ( y_i),即:

  • 如果样本的真实类别 (y_i = 1),那么我们希望模型预测的概率 ( p_i ) 越接近 1 越好。这意味着样本被正确预测为 1 类。

  • 如果样本的真实类别 ( y_i = 0 ),那么我们希望模型预测的概率 ( p_i ) 越接近 0 越好。这意味着样本被正确预测为 0 类。

损失函数的工作原理:
  • 当真实标签 ( y_i = 1) 时,损失函数的公式为:

  • [ L = - \log(p_i) ] 

  • 如果 ( p_i) 越接近 1,( \log(p_i) )  的值就越大,负号取反后,损失就越小。反之,( p_i ) 越小(越接近 0),损失就越大。

  • 当真实标签 ( y_i = 0 ) 时,损失函数的公式为:

  • [ L = - \log(1 - p_i) ]

  • 如果 ( p_i ) 越接近 0,( 1 - p_i ) 越接近 1,( \log(1 - p_i) )的值就越大,负号取反后,损失就越小。反之,( p_i ) 越接近 1,损失就越大。

举例讲解:

假设我们有一个样本,它的真实类别是 1,模型预测它的概率为 0.9。

根据损失函数公式: [ 损失 = - (1 \cdot \log(0.9)) = - \log(0.9) ] 由于预测的概率接近真实值(1 类),损失较小,说明模型预测得很好。

如果模型预测的概率为 0.1(远离真实值),则损失会非常大,表明模型预测得很差。

假设我们有以下两种情况的样本:

  1. 样本1:真实类别为 ( y_1 = 1 ),模型预测它属于 1 类的概率为( p_1 = 0.9 )

  2. 样本2:真实类别为 ( y_2 = 0 ),模型预测它属于 1 类的概率为 ( p_2 = 0.1 )

我们将通过损失函数公式计算这两个样本的损失值。

情况1:真实类别为 1,预测概率为 0.9

我们知道真实类别( y_1 = 1 ),根据损失函数公式,损失为:

[ L = - \log(0.9) ]

用计算器计算:[ \log(0.9) \approx -0.105 ]

因此,损失值为:[ L = - (-0.105) = 0.105 ]

这个损失值很小,说明模型的预测结果非常接近真实值,预测得很好。

情况2:真实类别为 0,预测概率为 0.1

我们知道真实类别 ( y_2 = 0 ),根据损失函数公式,损失为:

[ L = - \log(1 - 0.1) = - \log(0.9) ]

用计算器计算:[ \log(0.9) \approx -0.105 ]

因此,损失值为:[ L = - (-0.105) = 0.105 ]

同样,这个损失值也比较小,说明模型的预测结果较好,预测接近真实情况。

错误预测的情况

如果模型预测出现较大的错误,损失值会明显增大。

例如,假设模型在真实类别为 1 的情况下预测了 ( p_1 = 0.1 ),我们计算损失:

[ L = - \log(0.1) \approx 2.302 ]

损失值很大,说明模型的预测远离真实值,表现较差。

更复杂的例子:多个样本

假设我们有 3 个样本,它们的真实类别和模型预测的概率如下:

样本真实类别 ( y_i )模型预测的概率 ( p_i )损失( L_i )
110.9( - \log(0.9) \approx 0.105 )
200.8( - \log(1 - 0.8) = - \log(0.2) \approx 1.609 )
310.3( - \log(0.3) \approx 1.204 )
  • 样本1的预测接近真实值,损失较小。

  • 样本2的预测错误较大,损失明显较大。

  • 样本3的预测远离真实值,损失也很大。

总结

  • 损失值越小,说明模型的预测越好,接近真实值

  • 损失值越大,说明模型的预测远离真实值,表现较差

损失函数的优化

模型通过最小化损失函数来优化参数 ( w ) 和 ( b )。最小化损失函数意味着模型在逐步调整其权重,使得预测值越来越接近真实标签。通过 梯度下降法,模型不断更新参数,直到找到最优解。


6. 逻辑回归的优化:梯度下降

为了让模型能够更好地预测我们需要找到 最优的参数 ( w ) 和 ( b ),使得模型的预测结果尽可能接近真实值。为了达到这个目标,我们通常会通过 最小化损失函数 来找到这些最优参数。

为此,我们使用 梯度下降 来最小化损失函数。梯度下降(Gradient Descent) 是一种优化算法,旨在通过不断更新参数,找到使损失函数最小化的参数组合。

梯度下降的步骤:
  1. 计算损失函数的梯度:损失函数对参数 ( w ) 和 ( b ) 的偏导数。

  2. 更新参数:沿着负梯度方向更新参数,使得损失函数的值逐渐减小。

更新公式如下:

[ w = w - \alpha \cdot \frac{\partial L}{\partial w} ] 

这里的 ( \alpha ) 是学习率,控制每次更新的步长大小。

通过反复进行梯度下降,模型会逐渐找到最优的参数,使得损失函数达到最小值。

梯度下降的核心思想

梯度下降的核心思想是:找到损失函数下降最快的方向,并沿着这个方向不断更新模型的参数,直到找到最小值。

我们可以将这个过程想象为人在山坡上寻找最低点:

• 你站在山坡上的某一点,并且你可以感知到坡度的方向(梯度),这个坡度告诉你当前的方向是上坡还是下坡。

• 你希望找到山谷(最低点),因此你需要沿着坡度往下走(即沿着 负梯度方向 走),这样你每一步都会向山谷靠近。

• 如果坡度(梯度)很陡,你就走大步;如果坡度不大,你就走小步。走的每一步就是更新模型参数。

梯度的定义

在数学中,梯度 是一个向量,它表示损失函数关于每个参数的变化率。通俗地说,梯度告诉我们如何调整参数,才能让损失函数减少得最快。

对于参数  w  和  b ,它们的梯度分别是:

    •    损失函数  L  对  w  的偏导数: \frac{\partial L}{\partial w}
    •    损失函数  L  对  b  的偏导数: \frac{\partial L}{\partial b}

梯度的值表示当我们稍微改变  w  或  b  时,损失函数的变化情况。

为什么要沿着 负梯度方向 更新参数?

因为梯度表示的是损失函数在某一点上变化的方向,而我们的目标是最小化损失函数,因此需要沿着梯度减少的方向(即负梯度方向)更新参数。

公式解释:

我们沿着负梯度方向更新参数的公式为:

w = w - \alpha \cdot \frac{\partial L}{\partial w}


b = b - \alpha \cdot \frac{\partial L}{\partial b}


    •   \alpha  是 学习率(learning rate),是一个超参数,我们人为的设定学习率,使用它来控制每次更新的步长大小。如果学习率太大,可能会跳过最优解;如果学习率太小,收敛速度会很慢。


    •    \frac{\partial L}{\partial w} 和 \frac{\partial L}{\partial b} 是损失函数对  w  和  b  的梯度,表示参数  w  和  b  需要调整的方向和幅度。

负号的含义:因为我们希望使损失函数变小,而梯度的方向指向损失函数增大的方向,所以我们需要朝着 负梯度方向 调整参数,这样才能减小损失函数的值。

举例说明:梯度下降的过程

假设我们有一个简单的损失函数,假设函数的图像,形状类似一个碗,我们目标是到碗的最低点,也就是最小损失对应的参数值。梯度下降的过程如下:

    1.    初始化参数:首先,我们从随机的参数  w  和  b  开始。
    2.    计算梯度:在当前参数下,计算损失函数的梯度(求偏导),得到 \frac{\partial L}{\partial w}  和  \frac{\partial L}{\partial b} ,它们表示损失函数的变化方向。
    3.    更新参数:根据梯度公式,沿着负梯度方向更新参数:

w = w - \alpha \cdot \frac{\partial L}{\partial w}


b = b - \alpha \cdot \frac{\partial L}{\partial b}​​​​​​​

    4.    重复:重复计算梯度和更新参数的过程,直到损失函数值不再明显减少,也就是达到收敛。

\alpha 是学习率:学习率(Learning Rate,记作  \alpha) 是梯度下降算法中一个非常重要的超参数。它决定了每次更新参数时步长的大小,也直接影响模型训练的收敛速度和最终的效果。选择一个合适的学习率对模型的训练至关重要。

1. 过大(学习率过高)的问题

        如果学习率设置得太大,梯度下降的每一步都会走得很远,可能会跳过最优点,从而导致损失函数波动不定,甚至发散(损失函数越来越大)。

2. 过小(学习率过低)的问题

        如果学习率设置得太小,梯度下降的每一步会很小,模型收敛速度很慢,训练时间会大大增加,容易陷入局部最优。

3. 适中的学习率 ()

        合适的学习率可以保证模型的训练既快速又稳定,使损失函数逐步收敛到最小值。通常情况下,学习率适中时,损失函数的下降会是稳定的,并且收敛速度较快。

经验值:​​​​​​​

• 常见的学习率范围:0.001 到 0.1

• 具体的学习率选择应根据数据和模型的复杂程度来调整:

• 如果模型较为复杂(如深度神经网络),学习率通常设置得小一些(例如 0.001)。

  深度学习 中,通常使用的初始学习率为 0.0010.01

• 对于简单的线性回归、逻辑回归等模型,学习率可以设得稍大(例如 0.010.1)。


总结

  • 逻辑回归的工作原理:逻辑回归通过线性模型输出一个值,

  •          并通过 Sigmoid 函数将其转换为 0 到 1 之间的概率值,表示样本属于某一类的概率。

  • 损失函数:使用对数似然损失函数衡量模型预测结果与真实结果的差距,模型通过最小化损失函数来优化自身参数。

  • 梯度下降:通过梯度下降算法更新模型的参数,使损失函数逐渐减小,找到最优的模型参数。

逻辑回归是一种非常直观和基础的分类算法,理解了它的原理可以帮助我们更好地理解其他更复杂的模型。

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

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

相关文章

AI大模型项目实战v0.2: 结合个人知识库

前言 在AI大模型项目实战v0.1版本中,我们实现了一个最简单的基于纯LLM的问答机器人Tbot。 今天升级到v0.2版本,结合个人知识库。 本系列每个版本,都将提供完整的代码文档,获取方法见文末。 下面开启我们的v0.2版本之旅。 v0.2 Tb…

Icarus翼星求生教你使用服务器开服

1、购买后登录服务器(百度莱卡云游戏面板) 登录面板的信息在绿色的登陆面板按键下方,不是你的莱卡云账号 进入控制面板后会出现正在安装的界面,大约10分钟左右就能安装完成 2、创建端口 点击目录上的网络,再次页面下点…

中伟视界:AI算法如何精准识别井下与传送带上堆料,提升矿山安全生产效率,减少事故风险

传送带堆料分为两种情况,一种是传送带的井下堆料检测AI算法,一种是传送带上面的堆料检测AI算法,传送带井下堆料检测AI算法是在带式输送机的漏煤下方井下安装摄像仪,通过视频分析检测井下堆煤情况,当洒煤堆积到一定程度…

【Git入门】使用 Git 进行项目管理:Word Count 程序开发与托管

在软件开发过程中,版本控制工具是不可或缺的。Git 作为一款强大的分布式版本控制工具,为开发者提供了高效的代码管理和协作方式。本博客将介绍如何下载安装 Git 版本管理工具,并使用 Git 和 GitHub 平台进行一个名为 Word Count 的项目开发与…

二分

LeetCode34 在排序数组中查找元素的第一个和最后一个位置&#xff08;二分模板题&#xff0c;左闭右开写法&#xff09; /** lc appleetcode.cn id34 langcpp** [34] 在排序数组中查找元素的第一个和最后一个位置*/// lc codestart #include<iostream> using namespace s…

Python发送邮件教程:如何实现自动化发信?

Python发送邮件有哪些方法&#xff1f;如何利用python发送邮件&#xff1f; 无论是工作汇报、客户通知还是个人提醒&#xff0c;邮件都能快速传递信息。Python发送邮件的自动化功能就显得尤为重要。AokSend将详细介绍如何使用Python发送邮件&#xff0c;实现自动化发信&#x…

逆向推理+ChatGPT,让论文更具说服力

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 使用ChatGPT辅助“逆向推理”技巧&#xff0c;可以显著提升论文的质量和说服力。逆向推理从结论出发&#xff0c;倒推所需的证据和论点&#xff0c;确保整个论证过程逻辑严密且无漏洞。…

Spring Cloud :Hystrix实现优雅的服务容错

目录 Hystrix概述&#xff1a;第一个Hystrix程序步骤1&#xff1a;创建父工程hystrix-1步骤2&#xff1a;改造服务提供者步骤3&#xff1a;改造服务消费者为Hystrix客户端&#xff08;1&#xff09;添加Hystrix依赖&#xff08;2&#xff09;添加EnableHystrix注解&#xff08;…

编程练习2 数据单元的变量替换

示例1: 1,2<A>00 示例2: 1,2<A>00,3<A>00 示例3: <B>12,1,2<B>1 示例4: <B<12,1 输出依次如下&#xff1a; #include<iostream> #include<vector> #include<string>using namespace std;/* 字符分割函数 将传入…

人工智能-大语言模型-微调技术-LoRA及背后原理简介

1. 《LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS》 LORA: 大型语言模型的低秩适应 摘要&#xff1a; 随着大规模预训练模型的发展&#xff0c;全参数微调变得越来越不可行。本文提出了一种名为LoRA&#xff08;低秩适应&#xff09;的方法&#xff0c;通过在Transf…

STM32 使用 CubeMX 实现按键外部中断

目录 问题背景知识参考需要改什么注意尽量不要在中断函数使用 循环函数做延时中断函数中延时方法调试 问题 我想实现按钮触发紧急停止类似功能&#xff0c;需要使用按键中断功能。 背景知识 GPIO 点亮 LED。stm32cubemx hal学习记录&#xff1a;GPIO输入输出。STM32—HAL库 …

活动系统开发之采用设计模式与非设计模式的区别-后台功能总结

1、数据库ER图 2、后台功能字段 题目功能字段 数据列表 编号题目名称选项数量状态 1启用0禁用创建时间修改时间保存 题目名称选项集 选项内容是否正确答案 1正确0错误启禁用删除素材图库功能字段 数据列表 编号原文件名称文件类型文件大小加密后文件名文件具体路径上传类型状态…

从零开始学习Python

目录 从零开始学习Python 引言 环境搭建 安装Python解释器 选择IDE 基础语法 注释 变量和数据类型 变量命名规则 数据类型 运算符 算术运算符 比较运算符 逻辑运算符 输入和输出 控制流 条件语句 循环语句 for循环 while循环 循环控制语句 函数和模块 定…

29 C 语言中的随机数实现:rand 与 srand

目录 1 为什么需要随机数&#xff1f; 1.1 背景介绍 1.2 应用场景 2 C 语言实现随机数 2.1 rand() 函数 2.1.1 函数原型 2.1.2 功能说明 2.1.3 案例演示 2.2 srand() 函数 2.2.1 函数原型 2.2.2 功能说明 2.2.3 案例演示 2.3 指定范围的随机数 2.3.1 获…

【JavaEE】数据链路层协议和DNS

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【Java】登神长阶 史诗般的Java成神之路 &#x1f45c;一.以太网 以太网&#xff08;Ethernet&#xff09;是一种局域网技术&#xff0c;它定义了开放系统互连&#xff08;OSI&#xff09;模型中的物理…

Python网络爬虫获取Wallhaven壁纸图片(源码)

** 话不多说&#xff0c;直接附源码&#xff0c;可运行&#xff01; ** import requests from lxml import etree from fake_useragent import UserAgent import timeclass wallhaven(object):def __init__(self):# yellow# self.url "https://wallhaven.cc/search?co…

K8S介绍---搭建集群

Kubernetes介绍 官网&#xff1a;https://kubernetes.io/ 一、应用部署方式演变 1、传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其他技术的参与 缺点&#xff1a;不能为应用程序定义资源使用边界&a…

Java中List、ArrayList与顺序表

List、ArrayList与顺序表 List什么是List常用方法介绍List的使用 ArrayList与顺序表线性表顺序表接口的实现 ArrayList简介ArrayList的使用ArrayList的构造ArrayList的常见操作ArrayList的遍历ArrayList的扩容机制 ArrayList的具体使用杨辉三角简单的洗牌算法 ArrayList的问题及…

双向链表的基本结构及功能实现

1.基本结构: 双向链表是一种链表数据结构&#xff0c;它由一系列节点组成&#xff0c;每个节点包含三个部分&#xff1a; (1).数据域&#xff1a;存储节点的数据 (2).前驱指针:指向前一个节点 (3).后驱指针:指向下一个节点 2.基本特性&#xff1a; 双向链接: 与单向链表…

【WPF】02 按钮控件圆角配置及状态切换

按钮圆角 先从工具箱里拖进来一个Button控件&#xff0c;然后对这个按钮进行美化。 首先在 xaml 里按钮控件部分 添加如下代码&#xff1a; <Button x:Name"btnLogin" Content"登录" HorizontalAlignment"Center" Margin"0,399,0,0&q…