【第十六周】回顾线性回归与逻辑回归以及它们的详细推导过程

news2024/11/23 20:12:06

目录

  • 摘要
  • Abstract
  • 1.线性回归
    • 1.1.一元线性回归
      • 1.1.1.函数凹凸性判断
    • 1.2.多元线性回归
    • 1.3.进一步理解梯度下降法
  • 2.逻辑回归
    • 2.1.信息论角度推导交叉熵损失函数
    • 2.2.概率论角度推导交叉熵损失函数
  • 3.额外阅读:Label Smoothing
    • 3.1.One-hot 和 Label Smoothing 的优缺点对比
  • 总结

摘要

本周学校的机器学习课程正好讲完了逻辑回归内容,正好趁着这个时间来回顾以下之前所学的知识,手动推导了一下线性回顾与逻辑回归的全过程,顺便进行了一些额外的阅读学习。

Abstract

This week, the machine learning course at school has just finished covering the content on logistic regression. Taking advantage of this time, I reviewed the knowledge I had learned before, manually derived the entire process of linear regression and logistic regression, and took the opportunity to do some additional reading and learning.

1.线性回归

1.1.一元线性回归

在这里插入图片描述

线性回归的本质是寻找到一条直线去最大程度地拟合已有的数据,而对于多维线性回归,就是找到一条直线去拟合高维度下多个自变量和应变量的关系。

假设目前我们已经找到了一条直线 y = w x + b y=wx+b y=wx+b,那么我们如何去评价这条直线对现有数据拟合程度的好坏呢?

很容易想到的一个角度:我们可以拿真实值和预测值做对比,预测值越接近真实值说明拟合程度越高,换句话也就是说真实值和预测值的差距越小说明拟合程度越高。

衡量差距的有以下三种方法:

在这里插入图片描述

对于第一种方法来说,当计算多个样本点时可能会发生正负抵消的情况,导致总体的差距被相互中和。比如a点真实值与预测值的差距是10,b点真实值与预测值的差距是-10,而a点和b点的总体差距却是 10 − 10 = 0 10-10=0 1010=0 了,这显然不能正确地表示真实值和预测值的总体差距大小。

对于第二种方法来说,由于后面我们使差距最小时需要对这个差距进行求导,而绝对值内并不是处处可导的,所以我们也不选择第二个方法。

因此,第三个方法就非常符合我们目前的要求了。

在这里插入图片描述

1.1.1.函数凹凸性判断

参考来源:二元函数凹凸性的判别法、二元函数判断凹凸性-CSDN

f ( x , y ) f(x,y) f(x,y) 在区域 D D D内具有二阶连续偏导数,记 A = f x x ′ ′ ( x , y ) A=f''_{xx}(x,y) A=fxx′′(x,y) B = f x y ′ ′ ( x , y ) B=f''_{xy}(x,y) B=fxy′′(x,y) C = f y y ′ ′ ( x , y ) C=f''_{yy}(x,y) C=fyy′′(x,y),则
(1)在 D D D上恒有 A < 0 A<0 A<0,且 A C − B 2 ≥ 0 AC-B^2≥0 ACB20时, f ( x , y ) f(x,y) f(x,y)在区域 D D D上时凹函数;
(2)在 D D D上恒有 A > 0 A>0 A>0,且 A C − B 2 ≥ 0 AC-B^2≥0 ACB20时, f ( x , y ) f(x,y) f(x,y)在区域 D D D上时凸函数。

:这里的凸函数是指下凸,也就是我们常见的“凹函数”。中国大陆数学界某些机构关于函数凹凸性定义和国外的定义是相反的,但在中国大陆涉及经济学的很多书中,凹凸性的提法和其他国家的提法是一致的,也就是和数学教材是反的。
参考链接:凸函数定义

在这里插入图片描述

在这里插入图片描述
到这里就证明了 L ( w , b ) L(w,b) L(w,b)为凸函数,所有就可以进行凸优化操作了。

最优化损失函数 L ( w , b ) L(w,b) L(w,b)

因为 L ( w , b ) L(w,b) L(w,b)为凸函数,所以存在最小值点,且这个最小值点就是 L ( w , b ) L(w,b) L(w,b)的驻点。
在这里插入图片描述
在这里插入图片描述

正如上述推导过程,我们求出参数 w w w b b b的解析式,通过解析式我们可以很轻松地对一元线性回归问题进行求解:只需要把给定的数据进行相应的处理再代入解析式求解即可。

1.2.多元线性回归

类比一元线性回归,多元线性回归的本质就是找到一条高维直线最大程度地去拟合高维度下 y y y x ( x 1 , x 2 , . . . , x n ) x(x_1,x_2,...,x_n) x(x1,x2,...,xn) 的关系。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上述推导过程得到了参数 θ ( θ 1 , θ 2 , . . . , θ n ) θ(θ_1,θ_2,...,θ_n) θ(θ1,θ2,...,θn)的解析表达式,我们只需把所给数据代入上式即可。

这种直接求得解析解的方法称为正规方程法

正规方程法(Normal Equation Method)是一种用于求解线性回归问题的解析方法,它通过直接求解最小化损失函数的解析解来找到最优参数。与梯度下降法不同,正规方程法不需要迭代,而是通过矩阵运算一次性求解最优参数。

正规方程法虽然可以直接给出最优解,但是当特征数量很大时整个算法的计算复杂度非常高,达到了 O ( n 3 ) O(n^3) O(n3) ,这在高维数据集上显然是不可行的。并且正规方程法需要存储整个矩阵 X X X 和目标向量 y y y ,还需要计算和存储 X T X X^TX XTX ( X T X ) − 1 (X^TX)^{-1} (XTX)1。当数据集很大的时候,这些矩阵的存储和计算可能会超出内存限制。正规方程法只适用于线性回归模型,而对于其他类型的模型(如逻辑回归、神经网络等)不适用。

和正规方程法相比,梯度下降法的计算复杂度较低,特别是对于大规模数据集。除此之外,梯度下降法只需要存储当前的参数向量和梯度,以及每次迭代的中间结果。对于大规模数据集,可以使用小批量梯度下降(Mini-batch Gradient Descent)或随机梯度下降(Stochastic Gradient Descent)来减少内存需求。梯度下降法还具有很高的灵活性,可以应用于各种类型的模型和损失函数。通过调整损失函数和梯度计算,可以轻松扩展到带正则化的模型和其他非线性模型。此外,梯度下降法可以很容易地并行化,提高计算效率。

1.3.进一步理解梯度下降法

在这里插入图片描述

总结一下就是,对于xOy平面上的一个点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0) 在所有xOy平面上的任一方向都有方向导数,每个不同方向的方向导数揭示了函数 f ( x , y ) f(x,y) f(x,y) 在整个方向上的变化率。而当我们找到一个方向和点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0) 的梯度同向时,此时就是 f ( x , y ) f(x,y) f(x,y) 的函数值增加最快的方向。而当我们找到一个方向和点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0) 的梯度反向时,此时就是 f ( x , y ) f(x,y) f(x,y) 的函数值减少最快的方向。

更新参数

找到方向之后下一步就是更新参数了。那么如何控制参数向损失函数下降最快的方向变化呢?答案就是在梯度的负方向上进行逐步增量,用公式表示就是:
θ n e w = θ o l d − η ▽ L ( θ o l d ) θ_{new} = θ_{old} -η▽L(θ_{old}) θnew=θoldηL(θold)
其中:

(1)负号表示“负方向”;
(2) η η η 为学习率,是控制 θ θ θ 向着 L ( θ ) L(θ) L(θ) 的局部最小值进行变化的步长,学习率 η η η 不宜过大(太大容易跑过局部最小值),也不宜太小(太小前进的速度太缓慢);
(3) ▽ L ( θ ) ▽L(θ) L(θ) 为梯度向量,梯度向量控制变化方向。

遗留的问题

对于上面这个公式,一直有个现在看起来比较 弱智 的问题萦绕着我,那就是为什么一个参数向量可以直接加或者减另一个向量就可以更新参数?

其实答案早就在初中数学告诉我 了,向量除了表示方向之外,还蕴含了关于位移的信息。比如向量 ( 2 , 3 ) (2,3) (2,3) 也可以看作一个点从原点 ( 0 , 0 ) (0,0) (0,0) 移动到点 ( 2 , 3 ) (2,3) (2,3)

对于参数更新的例子,我们不妨假设向函数值增大最快的方向更新,并且去掉学习率来简化公式,例如:
( x 1 , y 1 ) = ( x 0 , y 0 ) + ▽ f ( x 0 , y 0 ) (x_1,y_1) = (x_0,y_0) +▽f(x_0,y_0) (x1,y1)=(x0,y0)+f(x0,y0)

假设 ( x 0 , y 0 ) = ( 1 , 1 ) (x_0,y_0)=(1,1) (x0,y0)=(1,1),而 ▽ f ( x 0 , y 0 ) = ( 2 , 3 ) ▽f(x_0,y_0)=(2,3) f(x0,y0)=(2,3),此时 ( 1 , 1 ) + ( 2 , 3 ) (1,1)+(2,3) (1,1)+(2,3)就相当于点 ( 1 , 1 ) (1,1) (1,1) 先向 x 轴移动两个单位,再向 y y y 轴移动三个单位,最后到达点 ( 3 , 4 ) (3,4) (3,4),这可不就是向 ( 2 , 3 ) (2,3) (2,3) 这个向量的方向移动嘛!

因此再回看这个公式:
θ n e w = θ o l d − η ▽ L ( θ o l d ) θ_{new} = θ_{old} -η▽L(θ_{old}) θnew=θoldηL(θold)

η η η 决定了我们移动步伐的大小,只需要一直循环这个过程就可以一步一步地更新到最小值。

关于梯度下降法就不再赘述,更详细的也可以参考这个链接:梯度下降法

2.逻辑回归

逻辑回归的本质就是将线性回归模型的 y y y 值映射成 0~1 的概率值 p p p ,然后根据这个概率值进行分类。

逻辑回归的损失函数用的是交叉熵损失函数,第一次学习逻辑回归时,对交叉熵损失函数的推导时通过极大似然估计的方式推导的。但是最近在学习信息论的时候对交叉熵损失函数有了新的理解,故从信息论的观点去推导一下交叉熵损失函数。

2.1.信息论角度推导交叉熵损失函数

在这里插入图片描述
在这里插入图片描述

现在新的问题又出现了,明明交叉熵公式中的 y i y_i yi 是一个概率值,为什么交叉熵损失函数中 y i y_i yi 却是个标签呢?

其实可以这样子理解:

对于分类任务来说,我们取得一个数据实际上也只能把它分到在唯一的一个类别中。例如在手写数字识别中(数字为0~9),若样本是数字5,则对应的真实分布应为 [ 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 ] [0,0,0,0,0,1,0,0,0,0] [0,0,0,0,0,1,0,0,0,0],所以在真实分布中的概率应为 P ( 5 ) = 1 P(5)=1 P(5)=1,而其他数字的概率均为0。也就是说, y i y_i yi 其实也可以看作是一个概率,只不过 y i y_i yi 的概率除了1就是0。假设网络输出分布为 [ 0.2 , 0.3 , 0.1 , 0 , 0 , 0.3 , 0.1 , 0 , 0 , 0 ] [0.2,0.3,0.1,0,0,0.3,0.1,0,0,0] [0.2,0.3,0.1,0,0,0.3,0.1,0,0,0],也就是说我们想要网络输出概率 P ( 5 ) P(5) P(5) 越接近1越好,而其他位置的概率越接近0就越好。

我们可以计算一下网络输出分布的loss,发现 L o s s ≈ 1.2040 Loss≈1.2040 Loss1.2040

再考虑第二个输出分布 [ 0.1 , 0.1 , 0 , 0 , 0 , 0.7 , 0 , 0.1 , 0 , 0 ] [0.1,0.1,0,0,0,0.7,0,0.1,0,0] [0.1,0.1,0,0,0,0.7,0,0.1,0,0],求解一下loss得 L o s s ≈ 0.3567 Loss≈0.3567 Loss0.3567。显然第二个输出分布的loss明显低于第一个分布,从概率分布上也可以轻易看出第二个输出分布更符合真实分布。

而在二分类问题中,不仅需要考虑模型对正类的预测能力,还需要考虑其对负类的预测能力。如果只用 − y l o g ( y ^ ) −ylog(\hat y) ylog(y^),那么损失函数将仅关注正类的预测,而忽略了负类。通过加入 − ( 1 − y ) l o g ( 1 − y ^ ) -(1−y)log(1−\hat y) (1y)log(1y^),我们可以同时评估模型对正类和负类的预测效果。通过同时考虑正类和负类的预测,模型可以更均衡地学习数据中的特征,避免过度关注某一类而忽略另一类,从而提高整体的泛化能力。
在这里插入图片描述
从图像中也可以看出,当y=1时,如果预测类别越接近1损失函数的值就越小,越接近0损失函数的值就越大;当y=0时,如果预测类别越接近0损失函数的值就越小,越接近1损失函数的值就越大。这样我们就定义了一个预测越离谱,损失就越大;预测越靠谱,损失就越小的损失函数。

也正是因为如此,交叉熵损失函数可以用来实现分类任务。

2.2.概率论角度推导交叉熵损失函数

这个部分的推导内容已经在【第二周】李宏毅机器学习笔记02里做过详细的推导,下面就用简单的公式快速复习一遍推导流程。

在这里插入图片描述

3.额外阅读:Label Smoothing

Label Smoothing 是机器学习领域的一种正则化方法,通常用于分类问题,目的是防止模型在训练时过于自信地预测标签,改善泛化能力差的问题。在交叉熵损失CrossEntropy_Loss中,非标签对应位置的预测信息是没有被使用的,也就是上文曾提到由于标签值为0从而交叉熵并未考虑负类的影响。而Label Smoothing使用了这种信息,宏观上讲,也是略微改变了标签的分布,使得标签不在是非0即1了,故而称为标签平滑。

Label Smoothing 使得 one-hot 编码的 hard label 转变为了 soft label,使网络优化更加平滑。

在这里插入图片描述

3.1.One-hot 和 Label Smoothing 的优缺点对比

One-Hot

优点

  • 明确的类别区分:每个类别都有唯一的向量表示,模型可以清楚地知道每个样本属于哪个类别。
  • 易于实现:实现简单,适用于大多数分类任务。
  • 计算效率高:在计算损失函数时,可以直接使用交叉熵损失(Cross-Entropy Loss),计算效率较高。

缺点

  • 过拟合风险:在小数据集上,模型可能会过度拟合训练数据,因为 one-hot 编码没有提供任何关于类别的额外信息。
  • 不考虑类别间的相似性:one-hot 编码将所有类别视为完全独立,忽略了类别之间的潜在相似性或关系。

Label Smoothing

优点

  • 减少过拟合:通过引入标签噪声,模型不容易过拟合训练数据,从而提高泛化能力。
  • 考虑类别间的相似性:Label Smoothing 隐式地考虑了类别之间的相似性,因为每个类别的标签不再是完全独立的。
  • 提升模型鲁棒性:模型对输入数据的变化更加鲁棒,能够在面对噪声或异常值时表现更好。

缺点

  • 增加复杂性:实现 Label Smoothing 相对复杂,需要调整超参数(如平滑因子)。
  • 可能降低性能:在某些情况下,Label Smoothing 可能会导致模型性能下降,尤其是在类别之间确实没有相似性的情况下。
  • 解释性差:相比于 one-hot 编码,Label Smoothing 的标签表示更难解释,因为每个类别的标签不再是简单的 0 或 1。

对于为什么标签平滑可以产生作用可以参考这篇论文:When Does Label Smoothing Help?
损失函数

总结

本周对线性回归和逻辑回归的重新推导加深了我对这些基础知识的印象,特别是对梯度和方向导数的理解中又更深入了一步,解决了很多之前并为注意到的遗留问题。希望往后也能这样继续充满学习热情来解决问题。下周见。

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

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

相关文章

解决报错:Invalid number of channels [PaErrorCode -9998]

继昨天重装了树莓派系统后&#xff0c;今天开始重新安装语音助手。在测试录音代码时遇到了报错“Invalid number of channels [PaErrorCode -9998]”&#xff0c;这是怎么回事&#xff1f; 有人说这是因为pyaudio没有安装成功造成的。于是&#xff0c;我pip3 install –upgrad…

利用python创建接口

目录 1. 创建一个简单的接口1.1 具体过程1.2 代码解读1. **导入 Flask**2. **创建 Flask 应用**3. **定义一个路由**4. **运行应用** 1.3 遗留问题 2. 创建一个复杂接口2.2 具体过程 1. 创建一个简单的接口 1.1 具体过程 from flask import Flaskapp Flask(__name__)app.rou…

pip安装指定版本的tensorflow

安装CPU版本&#xff1a;(以2.9.0版本为例) pip install tensorflow2.9.0安装GPU版本&#xff1a;(以2.9.0版本为例) pip install tensorflow-gpu2.9.0若下载缓慢&#xff0c;使用阿里国内镜像源加速下载&#xff1a;(以2.9.0版本为例) pip install -i https://mirrors.aliy…

一些硬件知识【20241013】

3C认证要花很多钱&#xff1a; X电容可以滤除差模信号干扰&#xff0c;当火线上有高频干扰信号时候&#xff0c;X电容利用两端压差将干扰送到N: Y电容针对于零火线上有相位相同的共模干扰信号的时候&#xff0c;将干扰导向大地&#xff1a; 电阻上并联一个电容有什么作用&#…

mac安装homebrew和git

简介 由于把自己的新mac拿来撸代码&#xff0c;开始环境搭建&#xff0c;安装各种工具和依赖&#xff0c;安装 git 需要先安装 homebrew&#xff0c;然后就遇到了 homebrew 安装失败的问题。 curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection…

多字节字符集MFC使用 Windows Visual Styles

新建一个记事本&#xff0c;然后添加以下代码 <?xml version"1.0" encoding"UTF-8" standalone"yes"?> <assembly xmlns"urn:schemas-microsoft-com:asm.v1" manifestVersion"1.0"><trustInfo xmlns"…

STM32 | STM32F4OTA_ESP8266_Bootloader为引导程序远程更新的代码(APP)

更新。点击上方"蓝字"关注我们 01、思路 >>> STM32F4OTA_ESP8266_Bootloader为引导程序 远程更新的代码&#xff08;APP&#xff09;:远程更新的APP Ymoden_server&#xff1a;为运行在Linux的TCP服务器 备注&#xff1a;STM32 OTA远程更新需要连接热点 电…

地级市-国内旅游收入、国内旅游人数数据(2000-2023年)

国内旅游收入是指国内游客在旅行过程中的全部花费&#xff0c;包括交通、参观游览、住宿、餐饮、购物和娱乐等。这一指标不包括国际游客在国内的消费&#xff0c;主要反映国内旅游市场的经济规模和发展水平&#xff0c;是评估旅游行业对国民经济贡献的重要参数。 地级市-国内旅…

安全可靠测评结果公告(2024年第2号)

大家可以选择对应的数据库&#xff0c;中央处理器&#xff0c;供参考

【C++】--内存管理

&#x1f47e;个人主页: 起名字真南 &#x1f47b;个人专栏:【数据结构初阶】 【C语言】 【C】 目录 1 C/C内存分布2 C语言中动态内存管理方式 &#xff1a;3 C内存管理方式3.1 new/delete操作内置类型3.2 new和delete操作自定义类型 4 operator new与operator delete4.1 opera…

Cortex-M 内核的 OS 特性

目录 一、通用堆栈知识二、双堆栈用法三、PendSV 中断介绍和用法四、SVC 软中断介绍和用法五、特权级和非特权级使用方法 一、通用堆栈知识 在前面讲解 STM32 启动文件的时候就已经提到过&#xff0c;有关堆栈大小的设置是在启动文件中设置的&#xff1a; Heap 主要用于 Mal…

学习Redisson实现分布式锁

官网&#xff1a;https://redisson.org/ 官方文档&#xff1a;https://redisson.org/docs/getting-started/ 官方中文文档&#xff1a;https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95 1、引入依赖 <!--redisson--> <dependency><groupId>or…

基础教程 | 用VuePress搭建一个简单的个人博客(附源码)

先附上自己个人博客页面&#xff1a;https://illusionno.github.io/ 源码也在这里&#xff1a;https://github.com/illusionno/my-blog &#xff08;如果觉得有帮助&#xff0c;可以点颗star✨&#xff09; 使用的主题是vuepress-theme-reco2.x&#xff0c;并在上面进行了一些调…

基于Java Web众筹系统的设计与实现

文未可获取一份本项目的java源码和数据库参考。 体育俱乐部是我国体育产业的重要组成部分&#xff0c;而乒乓球作为“国球”&#xff0c;在我国拥有最广泛的群众基础。在世界乒坛&#xff0c;面对如此激烈的外部竞争环境&#xff0c;我国乒乓球运动应扎扎实实地研究基层职业乒乓…

考研C语言程序设计_语法相关(持续更新)

目录 一、语法题strlen转义字符内置数据类型字符串结束标志局部变量和全局变量名字冲突 局部优先switch语句中的关键字数组初始化是否正确注意define不是关键字C语言中不能用连等判断switch( )的括号里可以是什么类型?关于if关于switch 二、程序阅读题有关static有关continue说…

初级前端面试(2)

1.讲一下闭包相关知识&#xff0c;和普通函数有什么区别 闭包是什么&#xff1a;JS中内层函数可以访问外层函数的变量&#xff0c;外层函数无法操作内存函数的变量的特性。我们把这个特性称作闭包。 闭包的好处&#xff1a; 隔离作用域&#xff0c;保护私有变量&#xff1b;…

快速了解接口测试

1、定义 什么是接口测试&#xff1f; 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 接口测…

Vue3高级API的使用

介绍 在前面的内容中&#xff0c;我们已经学习到了很多 Vue 3 的基础语法与一些常用的 API。 本节我们将介绍一些高级 API&#xff0c;带领大家进一步深入了解 Vue 3。 主要内容 ●customRef() ●markRaw() ●toRaw() ●获取 DOM 元素 customRef 方法 customRef&#…

DNS隧道技术原理及其典型应用场景剖析

DNS隧道&#xff08;DNS Tunneling&#xff09;本质为一种网络通信技术&#xff0c;它利用DNS协议在客户端和服务器之间传输数据&#xff0c;主要用来绕过网络限制进行数据隐蔽传输&#xff0c;但在实际场景中&#xff0c;DNS隧道已经成为黑客忠爱的攻击媒介。 1. 概览 DNS是互…

Linux之HugePage的原理与使用

Linux之HugePage的原理与使用 虚拟地址与物理地址虚拟地址物理地址虚拟地址与物理地址的转换 HugePage的概念Linux使用HugePage创建HugePage在程序中使用HugePage 总结 虚拟地址与物理地址 在研究HugePage之前&#xff0c;首先需要明白虚拟地址和物理地址的概念。在计算机系统…