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

集成学习(三)GBDT 梯度提升树

前面学习了:集成学习(二)Boosting-CSDN博客

梯度提升树:GBDT-Gradient Boosting Decision Tree

一、介绍

作为当代众多经典算法的基础,GBDT的求解过程可谓十分精妙,它不仅开创性地舍弃了使用原始标签进行训练的方式,同时还极大地简化了Boosting算法的运算流程,让Boosting算法本该非常复杂的运算流程变得清晰简洁。GBDT的数学流程非常简明、美丽,同时这一美丽的流程也是我们未来所有Boosting高级算法的数学基础。与任意Boosting算法一致,对GBDT我们需要回答如下问题:

  • 损失函数L(x,y) 的表达式是什么?损失函数如何影响模型构建?
  • 弱评估器 f(x) 是什么,当下boosting算法使用的具体建树过程是什么?
  • 综合集成结果 H(x) 是什么?集成算法具体如何输出集成结果?

同时,还可能存在其他需要明确的问题,例如:

  • 是加权求和吗?如果是,加权求和中的权重如何求解?
  • 训练过程中,拟合的数据Xy分别是什么?

回顾Boosting算法的基本指导思想,我们来梳理梯度提升树回归算法的基本流程。虽然Boosting理论很早就被人提出,但1999年才是GBDT算法发展的高潮。1999年,有四篇论文横空出世:

《贪心函数估计:一种梯度提升机器》
Friedman, J. H. (February 1999). "Greedy Function Approximation: A Gradient Boosting Machine"

《随机梯度提升》
Friedman, J. H. (March 1999). "Stochastic Gradient Boosting"

《梯度下降式提升算法》
Mason, L.; Baxter, J.; Bartlett, P. L.; Frean, Marcus (1999). "Boosting Algorithms as Gradient Descent"

《函数空间中的梯度下降式提升算法》
Mason, L.; Baxter, J.; Bartlett, P. L.; Frean, Marcus (May 1999). "Boosting Algorithms as Gradient Descent in Function Space"

GBDT算法是融合了上述4篇论文思想的集大成之作,为了保持一致,使用与前文不同的数学符号。

二、数学过程

假设现有数据集 ,含有形如\left ( x_{i}, y_{i} \right )的样本M个,i为任意样本的编号,单一样本的损失函数为l\left ( y_{i}, H\left ( x_{i} \right ) \right ),其中 H\left ( x_{i} \right )i号样本在集成算法上的预测结果,整个算法的损失函数为 L\left ( y, H( x ) \right ),且总损失等于全部样本的损失之和:L(y,H(x))=\sum_{i}^{}l\left ( y_{i}, H\left ( x_{i} \right ) \right )。同时,弱评估器为回归树 ,总共学习T轮。则GBDT回归的基本流程如下所示:

1、初始化数据迭代的起点H_{0}(x)。sklearn当中,我们可以使用0、随机数或者任意算法的输出结果作为H_{0}(x) ,但在最初的论文中,Friedman定义了如下公式来计算 H_{0}(x) :

其中 y_{i} 为真实标签, C 为任意常数。以上式子表示,找出令\sum_{i}^{M}l\left ( y_{i}, C \right ) 最小的常数 C 值,并输出最小的 \sum_{i}^{M}l\left ( y_{i}, C \right )作为H_{0}(x)的值。需要注意的是,由于H_{0}(x)是由全部样本的l计算出来的,因此所有样本的初始值都是H_{0}(x),不存在针对某一样本的单一初始值。

开始循环,for t in 1,2,3...T:

2、在现有数据集 N 中,抽样 M∗subsample 个样本,构成训练集N_{t}
3、对任意一个样本i ,计算伪残差(pseudo-residuals)r_{it},具体公式为:

不难发现,伪残差是一个样本的损失函数对该样本在集成算法上的预测值求导后取负的结果,并且在进行第t次迭代、计算第t个伪残差时,我们使用的前t-1次迭代后输出的集成算法结果。在t=1时,所有伪残差计算中的H_{t-1}(x_{i}) 都等于初始H_{0}(x),在t> 0时,每个样本上的 H_{t-1}(x_{i})都是不同的取值。

4、求解出伪残差后,在数据集 \left ( x_{i},r_{it} \right )上按照CART树规则建立一棵回归树f_{t},训练时拟合的标签为样本的伪残差r_{it} 。

5、将数据集N_{t}上所有的样本输入f_{t}进行预测,对每一个样本,得出预测结果f_{t}\left ( x_{i} \right )。在数学上我们可以证明,只要拟合对象是伪残差 r_{it},则f_{t}\left ( x_{i} \right )的值一定能让损失函数最快减小。

6、根据预测结果f_{t}\left ( x_{i} \right )迭代模型,具体来说:

假设输入的步长为\eta,则H_{t}(x)应该为:

对整个算法则有:

7、循环结束,输出 H_{T}(x) 的值作为集成模型的输出值。

三、初始化 H_{0}过程中的常数C是什么?

在最初的论文中,Friedman定义了如下公式来计算H_{0} :

其中 y_{i} 为真实标签, C 为任意常数。以上式子表示,找出令\sum_{i}^{M}l\left ( y_{i}, C \right ) 最小的常数 C 值,并输出最小的 \sum_{i}^{M}l\left ( y_{i}, C \right )作为H_{0}(x)的值。在刚观察这个式子时,大家可能很难理解 C 这个常数的作用,但这个式子实际上很简单。

首先,l是损失函数,损失函数衡量两个自变量之间的差异,因此l\left ( y_{i}, C \right )衡量样本i的真实标签y_{i} 与常数C之间的差异,因此l\left ( y_{i}, C \right )是所有样本的真实标签与常数C之间的差异之和。现在我们要找到一个常数C,令所有样本的真实标签与常数C的差异之和最小,请问常数C是多少呢?这是一个典型的求极值问题,只需要对\sum_{i}^{M}l\left ( y_{i}, C \right ) 求导,再令导数为0就可以解出令\sum_{i}^{M}l\left ( y_{i}, C \right )最佳的C。假设 l 是squared_error,每个样本的平方误差,则有:

对上述式子求导,并令一阶导数等于0:

所以:

可知,当L是平方误差squared error时,令 l\left ( y_{i}, C \right ) 最小的常数C就是真实标签的均值。因此,式子 H_{0}=argmin_{C}\sum_{i}^{M}l\left ( y_{i}, C \right )的本质其实是求解 C=mean\left ( y_{i} \right )时的损失函数,并以此损失函数作为 H_{0}的值。当然,如果我们选择了其他的损失函数,我们就需要以其他方式(甚至梯度下降)进行求解, C 的值可能也就不再是均值了。

四、为什么拟合伪残差可以令损失函数最快地减小

从直觉上来看,拟合伪残差可以降低H_{t}\left ( x_{i} \right )与 y_{i} 之间的差异,从而降低整体损失函数的值,但这个行为在数学上真的可行吗?毕竟,GBDT可以使用任意可微函数作为损失函数,不同损失函数求导后的结果即便与残差相似,也未必能代替真正的残差的效果。因此,不仅在直觉上需要理解拟合伪残差的作用,我们还需要从数学上证明:只要拟合对象是伪残差r_{it},则弱评估器的输出值 f_{t}\left ( x_{i} \right ) 一定是让损失函数减小最快的值。

我们可以对损失函数进行泰勒展开。对单一样本而言,我们有损失函数l(y_{i},H_{t-1}(x_{i})+f_{t}(x_{i})),其中 y_{i}是已知的常数,因此损失函数可以被看做是只有H_{t-1}(x_{i})+f_{t}(x_{i})一个自变量的函数,从而简写为 l(H_{t-1}(x_{i})+f_{t}(x_{i}))

根据一阶泰勒展开,已知:

该式子中H_{t-1}(x_{i}) 是常数,因此第一部分l(H_{t-1}(x_{i}))也是一个常数。同时,第二部分由导数和f_{t}组成,其中导数就是梯度,可以写作 g_{i} ,所以式子可以化简为:

现在,如果要令 l 最小, f_{t}(x_{i}) 应该等于多少呢?回到我们最初的目标,找出令损失函数l最小的f_{t}值:

常数无法被最小化,因此继续化简:

现在, g_{t}是包含了所有样本梯度的向量,f_{t}(x) 是包含了所有样本在f_{t}上预测值的向量,两个向量对应位置元素相乘后求和,即表示为向量的内积,由尖括号 〈〉 表示。现在我们希望求解向量内积的最小值、并找出令向量内积最小的f_{t}(x)的取值,那就必须先找出f_{t}(x)的方向,再找出 f_{t}(x) 的大小。

1、方向

f_{t}(x)的方向应该与g_{t}完全相反。向量的内积 \left \langle g_{t} f_{t}(x)\right \rangle=\left |g_{t} \right |\left | f_{t} (x) \right |cos(\alpha),其中前两项为两个向量的模长, α 是两个向量的夹角大小。模长默认为整数,因此当且仅当两个向量的方向完全相反,即夹角大小为180度时, cos(α) 的值为-1,才能保证两个向量的内积最小。假设向量 a = [1,2],向量b是与a的方向完全相反的向量。假设a和b等长,那向量b就是[-1,-2]。因此,与g_{t}方向完全相反且等长的向量就是 ,-g_{t}f_{t}(x)的方向也正是-g_{t}的方向。

2、大小

对于向量a,除了[-1,-2]之外,还存在众多与其呈180度夹角、但大小不一致的向量,比如[-2,-4], [-0.5,-1],每一个都可以与向量a求得内积。并且我们会发现,当方向相反时,向量b中的元素绝对值越大,b的模长就越长,向量a与b的内积就越小。因此不难发现, \left \langle g_{t} f_{t}(x)\right \rangle 是一个理论上可以取到无穷小的值,那我们的 ft(x) 应该取什么大小呢?答案非常出乎意料:任何大小都无所谓。

回到我们的迭代公式:

无论 f_{t}(x)的大小是多少,我们都可以通过步长 η 对其进行调整,只要能够影响 H(x),我们就可以影响损失迭代过程中的常数的大小。因此在数学上来说,f_{t}(x) 的大小可以是-g_{t}的任意倍数,这一点在梯度下降中其实也是一样的。为了方便起见,同时为了与传统梯度下降过程一致,我们通常让 f_{t}(x)就等于一倍的-g_{t},但也有不少论文令 f_{t}(x)等于其他值的。在GBDT当中:

这就是我们让GBDT当中的弱评估器拟合伪残差/负梯度的根本原因。拟合负梯度其实为GBDT带来了非常多的特点:

首先,通过直接拟合负梯度,GBDT避免了从损失函数找“最优”的过程,即避免了上述证明中求解 f_{t}=argmin_{f}\sum_{i=1}^{M}l\left ( H_{t-1}(x_{i})+f_{t}(x_{i}) \right ) 的过程,从而大大地简化了计算。

其次,通过拟合负梯度,GBDT模拟了梯度下降的过程,由于结合了传统提升法Boosting与梯度下降,因此才被命名为梯度提升法(Gradient Boosting)。这个过程后来被称为函数空间上的梯度下降(Gradient Descent in Function Space),这是视角为Boosting算法的发展奠定了重要的基础。

最后,最重要的一点是,通过让弱评估器拟合负梯度,弱评估器上的结果可以直接影响损失函数、保证损失函数的降低,从而指向Boosting算法的根本目标:降低偏差。这一过程避免了许多在其他算法中需要详细讨论的问题:例如,每个弱评估器的权重 ϕ 是多少,以及弱评估器的置信度如何。

在AdaBoost算法当中,损失函数是“间接”影响弱评估器的建立,因此有的弱评估器能够降低损失函数,而有的弱评估器不能降低损失函数,因此要在求和之前,需要先求解弱评估器的置信度,然后再给与置信度高的评估器更高的权重,权重 ϕ 存在的根本意义是为了调节单一弱评估器对 ϕ 的贡献程度。但在GBDT当中,由于所有的弱评估器都是能够降低损失函数的,只不过降低的程度不同,因此就不再需要置信度/贡献度的衡量,因此就不再需要权重 ϕ 。

五、遗留问题

有些细节性的东西本文还没有讲到,比如:

  1. 叶子结点如何取值?
  2. 其他损失函数下怎么推导?
  3. ...

详见下面《集成学习(四)DT、GBDT 公式推导》,注意:这两篇文章的符号不一样!!

接下来学习:

相关文章:

集成学习(三)GBDT 梯度提升树

前面学习了:集成学习(二)Boosting-CSDN博客 梯度提升树:GBDT-Gradient Boosting Decision Tree 一、介绍 作为当代众多经典算法的基础,GBDT的求解过程可谓十分精妙,它不仅开创性地舍弃了使用原始标签进行…...

后端工作之一:CrapApi —— API接口管理系统部署

一个API接口的网络请求都有这些基本元素构成: API接口大多数是由后端编写,前端开发人员进行请求调用 就是一个网络请求的流程。 API(Application Programming Interface)接口是现代软件开发中不可或缺的一部分。它们提供了一种…...

20240706 xenomai系统中网口(m2/minipcie I210网卡)的实时驱动更换

lspci 查看网口 查看网口驱动 1 ubuntu 查看网口驱动 在Ubuntu中,您可以使用lshw命令来查看网络接口的驱动信息。如果lshw没有安装,您可以通过执行以下命令来安装它: sudo apt-get update sudo apt-get install lshw 安装完成后&#xff…...

模型训练之数据集

我们知道人工智能的四大要素:数据、算法、算力、场景。我们训练模型离不开数据 目标 一、数据集划分 定义 数据集:训练集是一组训练数据。 样本:一组数据中一个数据 特征:反映样本在某方面的表现、属性或性质事项 训练集&#…...

【TB作品】数码管独立按键密码锁,ATMEGA16单片机,Proteus仿真 atmega16数码管独立按键密码锁

文章目录 基于ATmega16的数码管独立按键密码锁设计实验报告实验背景硬件介绍主要元器件电路连接 设计原理硬件设计软件设计 程序原理延时函数独立按键检测密码显示主函数 资源代码 基于ATmega16的数码管独立按键密码锁设计实验报告 实验背景 本实验旨在设计并实现一个基于ATm…...

数据库主从复制

目录 一.主从复制架构 二.主从复制原理 三.实现主从复制配置 1.新建主从复制 2.实战遇到问题 3.复制错误解决方法 4.级联 主从复制 5.半同步复制 MySQL数据库的主从复制(Master-Slave Replication)是一种常见的数据库复制架构,用于提…...

昇思25天学习打卡营第13天|BERT

一、简介: BERT全称是来自变换器的双向编码器表征量(Bidirectional Encoder Representations from Transformers),它是Google于2018年末开发并发布的一种新型语言模型。与BERT模型相似的预训练语言模型例如问答、命名实体识别、自…...

跨平台书签管理器 - Raindrop

传统的浏览器书签功能虽然方便,但在管理和分类上存在诸多局限。今天,我要向大家推荐一款功能强大的跨平台书签管理-Raindrop https://raindrop.io/ 📢 主要功能: 智能分类和标签管理 强大的搜索功能 跨平台支持 分享与协作 卡片式…...

均匀采样信号的鲁棒Savistky-Golay滤波(MATLAB)

S-G滤波器又称S-G卷积平滑器,它是一种特殊的低通滤波器,用来平滑噪声数据。该滤波器被广泛地运用于信号去噪,采用在时域内基于多项式最小二乘法及窗口移动实现最佳拟合的方法。与通常的滤波器要经过时域-频域-时域变换…...

c++ 可以再头文件种直接给成员变量赋值吗

在C中,你通常不能在头文件中直接给类的成员变量赋值,因为这会导致每个包含该头文件的源文件中都尝试进行赋值,从而引发多重定义错误。然而,你可以在类的构造函数中初始化成员变量,或者在类声明中使用初始化列表或默认成…...

47.HOOK引擎优化支持CALL与JMP位置做HOOK

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 上一个内容:46.修复HOOK对代码造成的破坏 以 46.修复HOOK对代码造成的破坏 它的代码为基础进行修改 优化的是让引擎支持从短跳JMP(E9&…...

liunx上修改Firefox版本号

在Linux上修改Firefox的版本号并不直接推荐也不鼓励,因为这可能会影响到浏览器的安全性、兼容性和自动更新功能。但如果你因为某些特殊测试场景确实需要修改其显示的版本号(请注意,这样做可能会引发不可预料的问题),可…...

bug——多重定义

bug——多重定义 你的问题是在C代码中遇到了"reference to data is ambiguous"的错误。这个错误通常发生在你尝试引用一个具有多重定义的变量时。 在你的代码中,你定义了一个全局变量data,同时,C标准库中也有一个名为data的函数模板…...

将堆内存的最小值(Xms)与最大值(Xmx)设置为相同的配置,可以防止JVM在运行过程中根据需要动态调整堆内存大小

将堆内存的最小值(Xms)与最大值(Xmx)设置为相同的配置,可以防止JVM在运行过程中根据需要动态调整堆内存大小,从而避免因内存分配策略变化引起的性能波动,也就是所谓的"内存震荡"&…...

安装 tesseract

安装 tesseract 1. Ubuntu-24.04 安装 tesseract2. Ubuntu-24.04 安装支持语言3. Windows 安装 tesseract4. Oracle Linux 8 安装 tesseract 1. Ubuntu-24.04 安装 tesseract sudo apt install tesseract-ocr sudo apt install libtesseract-devreference: https://tesseract-…...

为适配kubelet:v0.4 安装指定版本的docker

系统版本信息 cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) iso 文件下载地址 https://vault.centos.org/7.6.1810/isos/x86_64/CentOS-7-x86_64-DVD-1810.iso0.4 版本的kubelet 报错信息记录 E0603 19:00:38.273720 44142 kubelet.go:734] Error synci…...

vivado CLOCK_REGION、CLOCK_ROOT

时钟区域 CLOCK_REGION属性用于将时钟缓冲区分配给 UltraScale设备,同时让Vivado放置程序将时钟缓冲区分配给最佳站点 在该区域内。 重要提示:对于UltraScale设备,不建议将时钟缓冲区固定到特定站点,因为 你可以在时钟上规划一个7…...

alphazero学习

AlphaGoZero是AlphaGo算法的升级版本。不需要像训练AlphaGo那样,不需要用人类棋局这些先验知识训练,用MCTS自我博弈产生实时动态产生训练样本。用MCTS来创建训练集,然后训练nnet建模的策略网络和价值网络。就是用MCTSPlayer产生的数据来训练和…...

剖析DeFi交易产品之UniswapV3:交易路由合约

本文首发于公众号:Keegan小钢 SwapRouter 合约封装了面向用户的交易接口,但不再像 UniswapV2Router 一样根据不同交易场景拆分为了那么多函数,UniswapV3 的 SwapRouter 核心就只有 4 个交易函数: exactInputSingle:指…...

Agent下载安装步骤

目录 一. 环境准备 二. 部署安装 三. Server端Web页面添加agent客户端 一. 环境准备 准备一台虚拟机,关闭防火墙和selinux,进行时间同步。 版本主机名IP系统zabbix6.4-agentweb1192.168.226.29Rocky_linux9.4 修改主机名 [rootlocalhost ~]# hostna…...

2024年AI技术深入研究

2024年AI技术持续快速发展,应用领域广泛,产业发展迅速,市场趋势积极,学术研究深入。 AI技术进展大模型发展 2024年,智谱AI正在研发对标OpenAI Sora的高质量文生视频模型,预计最快年内发布。智谱AI的进展显示了国内AI大模型领域的快速发展,以及与国际领先技术的竞争态势…...

Apache Seata分布式事务启用Nacos做配置中心

本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 Seata分布式事务启用Nacos做配置中心 Seata分布式事务启用Nacos做配置中心 项目地址 本文作…...

Emacs之解决:java-mode占用C-c C-c问题(一百四十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…...

go语言day10 接口interface 类型断言 type关键字

接口: 空接口类型: 要实现一个接口,就要实现该接口中的所有方法。因为空接口中没有方法,所以自然所有类型都实现了空接口。那么就可以使用空接口类型变量去接受所有类型对象。 类比java,有点像Object类型的概念&#x…...

Java实现登录验证 -- JWT令牌实现

目录 1.实现登录验证的引出原因 2.JWT令牌2.1 使用JWT令牌时2.2 令牌的组成 3. JWT令牌(token)生成和校验3.1 引入JWT令牌的依赖3.2 使用Jar包中提供的API来实现JWT令牌的生成和校验3.3 使用JWT令牌验证登录3.4 令牌的优缺点 1.实现登录验证的引出 传统…...

liunx文件系统,日志分析

文章目录 1.inode与block1.1 inode与block概述1.2 inode的内容1.3 文件存储1.4 inode的大小1.5 inode的特殊作用 2.硬链接与软链接2.1链接文件分类 3.恢复误删除的文件3.1 案例:恢复EXT类型的文件3.2 案例:恢复XFS类型的文件3.2.1 xfsdump使用限制 4.分析日志文件4.1日志文件4.…...

Apipost接口测试工具的原理及应用详解(二)

本系列文章简介: 随着软件行业的快速发展,API(应用程序编程接口)作为不同软件组件之间通信的桥梁,其重要性日益凸显。API的质量直接关系到软件系统的稳定性、性能和用户体验。因此,对API进行严格的测试成为软件开发过程中不可或缺的一环。在众多API测试工具中,Apipost凭…...

「AIGC」大数据开发语言Scala入门

Scala 是一种多范式编程语言,设计初衷是集成面向对象编程和函数式编程的特点。它运行在 Java 虚拟机(JVM)上,因此可以与 Java 库无缝集成。Scala 也因其在大数据处理领域的应用而受到欢迎,特别是与 Apache Spark 这类框架结合使用。 1. 环境搭建 安装 Scala:可以从 Scala…...

2.1 tmux和vim

文章目录 前言概述tmuxvim总结 前言 开始学习的时间是 2024.7.6 ,13:47 概述 最好多使用,练成条件反射式的 直接使用终端的工具,可以连接到服务器,不需要使用本地的软件 tmux 这个主要有两个功能,第一个功能是分…...

运行vue : 无法加载文件 C:\Program Files\nodejs\node_global\vue.ps1,因为在此系统上禁止运行脚本。

报错背景: 重装了win10系统,然后准备安装Vue,这个时候我已经安装好了node.js和npm,输入node -v和npm -v都有正确输出,但是每次输入npm install -g vue/cli 安装的时候,就会报错. 大家安装node.js的时候最好就是默认路径(C:\Program Files\nodejs),别去修改不然很多报错.(个人…...

Lambda架构

1.Lambda架构对大数据处理系统的理解 Lambda架构由Storm的作者Nathan Marz提出,其设计目的在于提供一个能满足大数据系统关键特性的架构,包括高容错、低延迟、可扩展等。其整合离线计算与实时计算,融合不可变性、读写分离和复杂性隔离等原则&…...

数据库作业day3

创建一个student表用于存储学生信息 CREATE TABLE student( id INT PRIMARY KEY, name VARCHAR(20) NOT NULL, grade FLOAT ); 向student表中添加一条新记录 记录中id字段的值为1,name字段的值为"monkey",grade字段的值为98.5 insert into …...

计算机网络——数据链路层(以太网扩展、虚拟局域网、高速以太网)

在许多情况下,我们希望把以太网的覆盖范围扩展。本节先讨论在物理层把以太网扩展,然后讨论在数据链路层把以太网扩展。这种扩展的以太网在网络层看来仍然是一个网络。 在物理层扩展以太网 现在,扩展主机和集线器之间的距离的一种简单方法就是…...

Nuxt 项目集成第三方UI组件库(九)

Nuxt.js 本身并不提供内置的 UI 组件库,它是一个用于构建服务端渲染(SSR)和静态生成(SSG)Vue.js应用的框架。Nuxt.js 的设计目的是提供基础的架构和配置,以便开发者可以根据自己的需求选择和集成第三方 UI …...

vulnhub靶场之Jarbas

1 信息收集 1.1 主机发现 arp-scan -l 发现主机IP地址为:192.168.1.16 1.2 端口发现 nmap -sS -sV -A -T5 -p- 192.168.1.16 存在端口22,80,3306,8080 1.3 目录扫描 dirsearch -u 192.168.1.16 2 端口访问 2.1 80端口 2.2…...

解决onlyoffice警告的一些思路

解决思路&#xff1a; 1、监听出现警告的事件&#xff1a;已经实现 <script setup> import {message} from "ant-design-vue";const onError (event) > {console.log("ONLYOFFICE Document Editor reports an error: code " event.data.error…...

快速上手指南:使用 Minikube 在本地运行 Kubernetes 集群

前言 Minikube 是一个开源工具&#xff0c;用于在本地运行 Kubernetes 集群。它提供了一种简单的方法来在本地开发和测试 Kubernetes 应用程序&#xff0c;而无需设置完整的 Kubernetes 集群。以下是 Minikube 的基本使用步骤&#xff1a; 安装 Minikube 安装依赖项 虚拟化…...

【C语言】指针(1):入门理解篇

目录 一、内存和地址 1.1内存 1.2 深入理解计算机编址 二、指针变量和地址 2.1 取地址操作符&#xff08;&&#xff09; 2.2 指针变量和解应用操作符 2.2.1 指针变量 2.2.2 解引用操作符 2.3指针变量的大小 三、指针变量类型的意义 3.1 指针的解引用 3.1指针-整数…...

经典双运算放大器LM358

前言 LM358双运放有几十年的历史了吧&#xff1f;通用运放&#xff0c;很常用&#xff0c;搞电路的避免不了接触运放&#xff0c;怎么选择运放&#xff0c;是工程师关心的问题吧&#xff1f; 从本文开始&#xff0c;将陆续发一些常用的运放&#xff0c;大家选型可以参考&#…...

adb不插usb线通过wifi调试

说起做手机开发也有好多年了&#xff0c;说来惭愧&#xff0c;我最近才知道安卓手机是可以不插数据线进行开发调试的。起因是公司近期采购了一批安卓一卡通设备&#xff0c;需要对其进行定制开发APP,但是由于我插USB调试发现没有反应。通过询问厂家才知道可以通过WIFI进行调试。…...

vulnhub--IMF

环境 攻击机&#xff1a;192.168.96.4 靶机&#xff1a;ip未知 主机探测 确定靶机ip为32的主机 端口扫描 访问80端口 外围打点 在contact.php页面源码中找到了flag1 之后没啥突破 但查看网络后发现contact.php页面请求的三个js文件的文件名很有特点&#xff0c;猜测是base64编码…...

ePTFE膜(膨体聚四氟乙烯膜)应用前景广阔 本土企业技术水平不断提升

ePTFE膜&#xff08;膨体聚四氟乙烯膜&#xff09;应用前景广阔 本土企业技术水平不断提升 ePTFE膜全称为膨体聚四氟乙烯膜&#xff0c;指以膨体聚四氟乙烯&#xff08;ePTFE&#xff09;为原材料制成的薄膜。ePTFE膜具有耐化学腐蚀、防水透气性好、耐候性佳、耐磨、抗撕裂等优…...

C++与C#创建位图,是否需要区分RGB和BGR模式

在处理位图时&#xff0c;确实需要区分RGB和BGR模式&#xff0c;因为不同的库和API对颜色通道的排序有不同的约定。具体到C与C#&#xff0c;这一点也是需要注意的。 C 创建位图 使用GDI或WIC (Windows Imaging Component): 当你在C中使用这些Windows API创建或操作位图时&…...

web学习笔记(八十)

目录 1.小程序实现微信一键登录 2. 小程序的授权流程 3.小程序配置vant库 4.小程序配置分包 5.小程序配置独立分包 6.小程序分包预下载 1.小程序实现微信一键登录 要先实现小程序一键登录首先我们需要给按钮设置一个绑定事件&#xff0c;然后在绑定事件内部通过wx.login…...

深度解析 Raft 分布式一致性协议

本文参考转载至&#xff1a;浅谈 Raft 分布式一致性协议&#xff5c;图解 Raft - 白泽来了 - 博客园 (cnblogs.com) 深度解析 Raft 分布式一致性协议 - 掘金 (juejin.cn) raft-zh_cn/raft-zh_cn.md at master maemual/raft-zh_cn (github.com) 本篇文章将模拟一个KV数据读写服…...

Android10以上实现获取设备序列号功能

Android10以上实现获取设备唯一标识&#xff0c;目前只支持华为和荣耀设备。实现原理&#xff1a;通过无障碍服务读取序列号界面。 public class DeviceHelper implements Application.ActivityLifecycleCallbacks {static final String TAG "WADQ_DeviceHelper";s…...

从0到1:培训老师预约小程序开发笔记二

背景调研 培训老师预约小程序&#xff1a; 教师和学生可以更便捷地安排课程&#xff0c;并提升教学质量和学习效果&#xff0c;使之成为管理和提升教学效果的强大工具。培训老师可以在小程序上设置自己的可预约时间&#xff0c;学员可以根据老师的日程安排选择合适的时间进行预…...

【FFmpeg】av_read_frame函数

目录 1.av_read_frame1.2 从pkt buffer中读取帧&#xff08;avpriv_packet_list_get&#xff09;1.3 从流当中读取帧&#xff08;read_frame_internal&#xff09;1.3.1 读取帧&#xff08;ff_read_packet&#xff09;1.3.2 解析packet&#xff08;parse_packet&#xff09;1.3…...

女生学计算机好不好?感觉计算机分有点高……?

众所周知&#xff0c;在国内的高校里&#xff0c;计算机专业的女生是非常少的&#xff0c;很多小班30人左右&#xff0c;但是每个班女生人数只有个位数。这就给很多人一个感觉&#xff0c;是不是女生天生就不适合学这个东西呢&#xff1f;女生是不是也应该放弃呢&#xff1f;当…...

windows10/11 如何开启卓越性能模式

在Windows 10和Windows 11中&#xff0c;可以通过以下步骤启用“卓越性能”模式。请注意&#xff0c;卓越性能模式仅在Windows 10 Pro for Workstations和Windows 10 Enterprise版本中可用。 使用命令提示符启用卓越性能模式 打开命令提示符&#xff1a; 按Win X键&#xff0…...