【机器学习入门】集成学习之梯度提升算法

系列文章目录

第1章 专家系统
第2章 决策树
第3章 神经元和感知机
识别手写数字——感知机
第4章 线性回归
第5章 逻辑斯蒂回归和分类
第5章 支持向量机
第6章 人工神经网络(一)
第6章 人工神经网络(二) 卷积和池化
第6章 使用pytorch进行手写数字识别
实操练习 使用Yolo模型进行物体检测
第7章 集成学习 AdaBoost算法


文章目录

  • 系列文章目录
  • 前言
  • 一、提升方法的基本思路
  • 二、梯度提升算法
    • 回顾梯度下降法
    • 梯度提升算法
    • 均方误差的梯度提升算法
  • 三、偏差与方差
  • 总结


前言

自适应增强算法AdaBoost是一种提升(Boosting)算法。提升算法,或者叫作增强算法,是以迭代的方式将若干弱模型组合为一个强模型,每一轮迭代产生一个“弱模型”,经过若干轮迭代之后,将弱模型进行加权融合,组成一个“强模型”。这就是提升算法的一般框架。而梯度提升算法,是另一种应用广泛的通用提升算法。


一、提升方法的基本思路

提升方法基于这样一种思想:对于一个复杂任务来说,将多个专家的判断进行适当的总和所得出的判断,要比其中任何一个专家单独的判断好。

“强可学习”strongly learnable
在概率近似正确(probably approximately correct, PAC)学习的框架中,一个概念(一个类),如果存在一个多项式的学习算法能够学习它,并且正确率很高,那么就称这个概念是强可学习的。
“弱可学习”weakly learnable
一个概念(一个类),如果存在一个多项式的学习算法能够学习它,学习的正确率仅比随机猜测略好,那么就称这个概念是弱可学习的。

Schapire后来证明强可学习与弱可学习是等价的,也就是说,在PAC学习的框架下,一个概念是强可学习的充分必要条件是这个概念是弱可学习的。

这样一来,如果已经发现了“弱学习算法”,那么能否将它提升(boost)为“强学习算法” 呢?
对于分类问题而言,给定一个训练样本集,求比较粗糙的分类规则(弱学习器)要比求精确的分类规则(强分类器)容易得多。提升方法就是从弱学习算法出发,反复学习,得到一系列弱分类器(又称基本分类器),然后组合这些弱分类器,构成一个强分类器。
大多数的提升方法都是改变训练数据的概率分布(训练数据的权值分布),针对不同的训练数据分布调用弱学习算法学习一系列弱分类器。

对于提升方法来说,有两个问题需要回答:一是在每一轮如何改变训练数据的权值或者概率分布;二是如何将弱分类器组合成一个强分类器。
对于第一个问题,AdaBoost的做法是,提高那些被前一轮弱分类器错误分类样本的权值,而降低那些被正确分类样本的权值。这样一来,那些没有得到正确分类的数据,由于其权值的加大,而受到后一轮的弱分类器的更大的关注。于是,分类问题被一系列的弱分类器“分而治之”。
对于第二个问题,AdaBoost采取加权多数表决的方法,加大分类误差小的弱分类器的权值,使其在表决中起较大作用;减小分类误差大的弱分类器的权值,使其在表决中起较小的作用。

二、梯度提升算法

梯度提升算法(Gradient Boosting)是梯度下降法(Gradient Desent Method)和提升算法(Boosting Algorithm)的结合。该算法将回归问题看作某种损失函数的优化问题,这是应用“梯度下降法”的一般思路。
回归问题的目标是产生一个函数映射,从给定的输入 x \boldsymbol{x} x产生一个输出 F ( x ) F(\boldsymbol{x}) F(x)。训练数据是一些已知的 ( x , y ) (\boldsymbol{x},y) (x,y)组合,训练这个预测模型的目标就是缩小 F ( x ) F(x) F(x) y y y的差距。可以采用最小二乘法中的均方误差,逻辑斯蒂回归中的交叉熵损失函数等。我们可以抽象的把这种差距记为函数 L ( F ( x ) , y ) L(F(\boldsymbol{x}),y) L(F(x),y) ,而梯度提升算法的目标就是最小化这个函数的值,这样我们就将一个回归问题转化为一个函数优化问题,对于函数优化问题,就可以采用梯度下降算法来解决。

回顾梯度下降法

梯度下降法的优化对象通常是模型的参数变量,而在梯度提升算法中,优化的对象是“弱模型”,弱模型本身就是一个函数,因此,我们要从“变量空间”的梯度下降,迁移到“函数空间”的梯度下降。
我们先观察“变量空间”中的梯度下降。假设我们要计算使得 L ( x ) L(\boldsymbol{x}) L(x)取得极小值的 x ∗ \boldsymbol{x}^* x
x ∗ = a r g   m i n x   L ( x ) \boldsymbol{x}^*=arg \space \underset{x}{min} \space L(\boldsymbol{x}) x=arg xmin L(x)
首先,给 x \boldsymbol{x} x一个初始猜测 x 0 \boldsymbol{x}_0 x0。然后计算在 x = x 0 \boldsymbol{x=\boldsymbol{x}_0} x=x0出的梯度,然后朝着梯度相反的方向给 x 0 \boldsymbol{x}_0 x0一个增量 Δ x 1 \Delta \boldsymbol{x}_1 Δx1,得到 x 1 \boldsymbol{x}_1 x1,依次类推。
在第 m m m次迭代,我们要计算如下的梯度 g m \boldsymbol{g}_m gm
g m = { [ ∂ L ( x ) ∂ x ] x = x m − 1 } \boldsymbol{g}_{m}=\left\{\left[\frac{\partial L(\boldsymbol{x})}{\partial \boldsymbol{x}}\right]_{\boldsymbol{x}=\boldsymbol{x}_{m-1}}\right\} gm={[xL(x)]x=xm1}
其中 x m − 1 \boldsymbol{x}_{m-1} xm1是此前 m − 1 m-1 m1次迭代的增量累加的结果。为了表达方便,我们令 Δ x 0 = x 0 \Delta \boldsymbol{x}_0=\boldsymbol{x}_0 Δx0=x0,则有
x m − 1 = ∑ i = 0 m − 1 Δ x i \boldsymbol{x}_{m-1}=\sum_{i=0}^{m-1}{\Delta \boldsymbol x_i} xm1=i=0m1Δxi
每次迭代的增量都朝着梯度相反的方向。设第 m m m次的学习率为 ρ m \rho_m ρm,那么,第 m m m次的增量 Δ x m \Delta \boldsymbol x_m Δxm如下:
Δ x m = − ρ m g m \Delta \boldsymbol x_m = -\rho _m \boldsymbol{g}_{m} Δxm=ρmgm
这个学习率也是可以优化的,根据损失函数找到每一步的最佳学习率。这相当于在梯度相反的方向上做一次线性搜索,找到使得损失函数极小化的点。
ρ m = a r g   m i n ρ   L ( x m − 1 − ρ g m ) \rho_m=arg \space \underset{\rho}{min} \space L(\boldsymbol{x}_{m-1}-\rho \boldsymbol{g}_m) ρm=arg ρmin L(xm1ρgm)
以上就是对梯度下降法的一般性描述。最终经过 M M M次迭代,可以找到一个能够极小化 L ( x ) L(\boldsymbol{x}) L(x) x M \boldsymbol{x}_M xM,这个 x M \boldsymbol{x}_M xM实际上是若干个增量 Δ x m \Delta \boldsymbol{x}_m Δxm的线性和,也就是若干个负梯度 − g m -\boldsymbol{g}_m gm的加权线性和。

梯度提升算法

下面我们将变量 x \boldsymbol{x} x换成函数 F F F,也就是预测模型最终希望得到的“强模型” 这个强模型最终是若干个“弱模型”的加权融合,产生弱模型的弱学习器的学习目标,是在每一轮迭代中向损失函数 L L L的梯度相反的方向前进一点。
我们要把梯度下降法中的变量 x \boldsymbol{x} x换成函数 F ( x ) F(\boldsymbol{x}) F(x)。假设训练数据集是一个有限的集合 ( x 1 , y 1 ) , ⋯   , ( x N , y N ) (\boldsymbol{x}_1,y_1),\cdots,(\boldsymbol{x}_N,y_N) (x1,y1),,(xN,yN),一共包含了 N N N组输入/输出组合 ( x i , y i ) (\boldsymbol{x}_i,y_i) (xi,yi)。我们的优化目标随之变为,寻找一个最优的函数 F ∗ ( x ) F^*(\boldsymbol{x}) F(x)使得损失函数 L L L最小化。
F ∗ = a r g   m i n F   ∑ i = 1 N L ( F ( x i ) , y i ) F^*=arg \space \underset{F}{min} \space \sum_{i=1}^{N} L(F(\boldsymbol{x}_i),y_i) F=arg Fmin i=1NL(F(xi),yi)
从一个简单的预测模型开始,假设这个模型的预测值是一个常数。如果误差函数 L L L是均方误差,那么,这个预测值实际上就是训练集中 y i y_i yi的平均值。对于任意误差函数 L L L,我们可以用下面更加一般化的形式描述这个初始模型的“粗糙”猜测 F 0 F_0 F0
F 0 ( x ) = a r g   m i n ρ   ∑ i = 1 N L ( ρ , y i ) F_0(\boldsymbol{x})=arg \space \underset{\rho}{min} \space \sum_{i=1}^{N} L(\rho,y_i) F0(x)=arg ρmin i=1NL(ρ,yi)
然后开始迭代,从 F 0 F_0 F0得到 F 1 F_1 F1,进而得到 F 2 F_2 F2,依次类推,最终逼近 F ∗ F^* F
假设已经有了 F m − 1 F_{m-1} Fm1,现在是第 m m m次迭代。计算误差函数 L L L相对于预测模型输出的 F ( x ) F(\boldsymbol{x}) F(x)的偏导数,在每一个数据点 x i \boldsymbol{x}_i xi上计算偏导数的相反数,把这个结果记作 y ~ i \tilde{y}_i y~i
y ~ i = − [ ∂ L ( F ( x i ) , y i ) ∂ F ( x i ) ] F ( x ) = F m − 1 ( x ) \tilde {y}_i =- \left [ \frac{\partial L(F(\boldsymbol{x}_i),y_i)}{\partial F(\boldsymbol{x}_i)} \right ] _{F(\boldsymbol{x})=F_{m-1}(\boldsymbol{x})} y~i=[F(xi)L(F(xi),yi)]F(x)=Fm1(x)
这样,会得到 N N N ( x i , y ~ i ) (\boldsymbol{x}_i,\tilde y_i) (xi,y~i),它们构成了一个新的数据集。这个新的数据集是由误差函数的负梯度组成的,它代表了 F F F的改进方向。我们要用一个弱学习器去学习如何改进。假设弱学习器是一个函数族 h ( x ; a ) h(\boldsymbol{x};\boldsymbol{a}) h(x;a),其中 a \boldsymbol{a} a是函数的参数,也就是弱学习器要学习的参数。
现在,要在数据集 { ( x i , y ~ ) } i = 1 N \left \{(\boldsymbol{x}_i,\tilde{y}) \right\}_{i=1}^{N} {(xi,y~)}i=1N上用弱学习器得到一个参数为 a m \boldsymbol{a}_m am的若预测模型 h ( x ; a m ) h(\boldsymbol{x};\boldsymbol{a}_m) h(x;am),它将是最终得到的强模型的一部分。

接下来,要决定这一轮得到的弱模型 h ( x ; a m ) h(\boldsymbol{x};\boldsymbol{a}_m) h(x;am) 在最终的模型中所占据的比例 ρ m \rho_m ρm。这仍然是一个最优化问题,优化的目标依然是误差函数 L L L
ρ m = a r g   m i n ρ   ∑ i = 1 N L ( F m − 1 ( x i ) + ρ h ( x i ; a m ) ,   y i ) \rho_m=arg \space \underset{\rho}{min} \space \sum_{i=1}^{N} L(F_{m-1}(\boldsymbol{x}_i)+\rho h(\boldsymbol{x}_i;\boldsymbol{a}_m) , \space y_i) ρm=arg ρmin i=1NL(Fm1(xi)+ρh(xi;am), yi)

然后,就得到了改进后的 F m F_m Fm,可以开始下一轮迭代,或者达到终止条件而结束迭代过程。
F m ( x ) = F m − 1 ( x ) + ρ m h ( x ; a m ) F_m(\boldsymbol{x})=F_{m-1}(\boldsymbol{x})+\rho_mh(\boldsymbol{x};\boldsymbol{a}_m) Fm(x)=Fm1(x)+ρmh(x;am)

这就是一般化的梯度提升算法。

算法2:梯度提升算法
建立初始模型 F 0 ( x ) = a r g   m i n ρ ∑ i = 1 N L ( ρ , y i ) F_0(\boldsymbol{x})=arg \space \underset{\rho}{min} \sum_{i=1}^{N}L(\rho,y_i) F0(x)=arg ρmini=1NL(ρ,yi)
for m = 1 , 2 , ⋯   , M m=1,2,\cdots,M m=1,2,,M do
对所有样本 i = 1 , ⋯   , N , i=1,\cdots,N, i=1,,N,计算梯度 y ~ i = − [ ∂ L ( F ( x i ) , y i ) ∂ F ( x i ) ] F ( x ) = F m − 1 ( x ) \tilde{y}_i=-\left [ \frac{\partial L(F(\boldsymbol{x}_i),y_i)}{\partial F(\boldsymbol{x}_i)} \right ] _{F(\boldsymbol{x})=F_{m-1}(\boldsymbol{x})} y~i=[F(xi)L(F(xi),yi)]F(x)=Fm1(x)
在数据集 { ( x i , y ~ ) } i = 1 N \left \{(\boldsymbol{x}_i,\tilde{y}) \right\}_{i=1}^{N} {(xi,y~)}i=1N上,用弱学习器得到模型 h ( x ; a m ) h(\boldsymbol{x};\boldsymbol{a}_m) h(x;am)
计算弱模型的最优权重 ρ m = a r g   m i n ρ   ∑ i = 1 N L ( F m − 1 ( x i ) + ρ h ( x i ; a m ) ,   y i ) \rho_m=arg \space \underset{\rho}{min} \space \sum_{i=1}^{N} L(F_{m-1}(\boldsymbol{x}_i)+\rho h(\boldsymbol{x}_i;\boldsymbol{a}_m) , \space y_i) ρm=arg ρmin i=1NL(Fm1(xi)+ρh(xi;am), yi)
得到改进后的模型 F m ( x ) = F m − 1 ( x ) + ρ m h ( x ; a m ) F_m(\boldsymbol{x})=F_{m-1}(\boldsymbol{x})+\rho_mh(\boldsymbol{x};\boldsymbol{a}_m) Fm(x)=Fm1(x)+ρmh(x;am)
end

均方误差的梯度提升算法

接下来我们将误差函数 L L L替换为一些真实的误差后,更加直观理解梯度提升算法的意义。
我们使用均方误差 L ( F , y ) = ( F − y ) 2 / 2 L(F,y)=(F-y)^2/2 L(F,y)=(Fy)2/2,均方误差的梯度计算如下,我们需要梯度的反方向(梯度下降),所以这里取偏导数的相反数。
− ∂ L ∂ F = y − F -\frac{\partial L}{\partial F} = y-F FL=yF
值得注意的是,当我们采用均方误差时,初始模型输出的常数值是所有样本 y i y_i yi的平均值。
y ˉ = 1 N ∑ i = 1 N y i = a r g   m i n ρ ∑ i = 1 N ( y i − ρ ) 2 \bar{y} =\frac{1}{N} \sum_{i=1}^{N} y_i = arg \space \underset{\rho}{min} \sum_{i=1}^{N}{(y_i-\rho)}^2 yˉ=N1i=1Nyi=arg ρmini=1N(yiρ)2

均方误差与绝对误差 L ( F − y ) = ∣ F − y ∣ L(F-y)=|F-y| L(Fy)=Fy比较:
绝对误差的最优常数输出是 y i y_i yi的中位数。
中位数与平均值的差别就在于其对噪声(离群点)的敏感度。离大多数值较远的噪声点会把平均值拉向噪声的方向,而对中位数没有影响。

现在将均方误差代入一般化的梯度提升算法。

算法3:采用均方误差的梯度提升算法
建立初始模型 F 0 ( x ) = y ˉ F_0(\boldsymbol{x})=\bar y F0(x)=yˉ
for m = 1 , 2 , ⋯   , M m=1,2,\cdots,M m=1,2,,M do
对所有样本 i = 1 , ⋯   , N , i=1,\cdots,N, i=1,,N,计算残差 y ~ i = y i − F m − 1 ( x i ) \tilde{y}_i=y_i-F_{m-1}(\boldsymbol{x}_i) y~i=yiFm1(xi)
在数据集 { ( x i , y ~ ) } i = 1 N \left \{(\boldsymbol{x}_i,\tilde{y}) \right\}_{i=1}^{N} {(xi,y~)}i=1N上,用弱学习器得到模型 h ( x ; a m ) h(\boldsymbol{x};\boldsymbol{a}_m) h(x;am)
计算弱模型的最优权重 ρ m = a r g   m i n ρ   ∑ i = 1 N L ( F m − 1 ( x i ) + ρ h ( x i ; a m ) ,   y i ) \rho_m=arg \space \underset{\rho}{min} \space \sum_{i=1}^{N} L(F_{m-1}(\boldsymbol{x}_i)+\rho h(\boldsymbol{x}_i;\boldsymbol{a}_m) , \space y_i) ρm=arg ρmin i=1NL(Fm1(xi)+ρh(xi;am), yi)
得到改进后的模型 F m ( x ) = F m − 1 ( x ) + ρ m h ( x ; a m ) F_m(\boldsymbol{x})=F_{m-1}(\boldsymbol{x})+\rho_mh(\boldsymbol{x};\boldsymbol{a}_m) Fm(x)=Fm1(x)+ρmh(x;am)
end

均方误差的梯度恰好是模型输出与真实目标输出之间的“残差”,实际上,我们是在教弱学习器从残差中学习,用这种方式不断逼近真实的目标输出。

三、偏差与方差

对于算法模型,我们希望能够衡量它在未知样本上的预测误差。
假设我们希望预测的问题是一个函数关系 y = f ( x ) y=f(x) y=f(x) x x x是输入, y y y是输出。
我们有一些训练样本 D D D,然后通过某个算法我们可以训练得到模型 f ^ D \hat{f}_D f^D,它在某个未知样本 x x x上的误差是 ( y − f ^ D ) 2 (y-\hat{f}_D)^2 (yf^D)2。由于训练样本总是只能覆盖样本空间中极其有限的样本,而且采集训练样本的过程中难免有一些误差(噪声或观测误差,比如标记错误的样本,模糊不清的图片等),因此,训练得到的模型总会不可避免地存在误差。
采用不同地训练样本集 D D D,就会有不同的误差。衡量算法的效能应该是与 D D D无关的,因此,我们用误差对所有可能的 D D D的期望来衡量算法的预测误差,即采用不同训练集得到的不同模型的平均误差。
模型误差的期望可以分解为偏差Bias的平方、方差Variance和随机噪声( σ 2 \sigma^2 σ2)的和。

E D [ ( y − f ^ D ( x ) 2 ) ] = ( B i a s D ) 2 + V a r D + σ 2 E_D [(y-\hat{f}_D(x)^2)]=(Bias_D)^2+Var_D+\sigma^2 ED[(yf^D(x)2)]=(BiasD)2+VarD+σ2
其中,偏差是不同训练集得到的不同模型的预测结果的均值与样本的真实值之间的差异。
B i a s D = E D [ f ^ D ( x ) ] − f ( x ) Bias_D=E_D[\hat{f}_D(x)]-f(x) BiasD=ED[f^D(x)]f(x)
方差是不同模型对于同一未知样本的预测值的方差。
V a r D = E D [ ( E D [ f ^ D ( x ) ] − f ^ D ( x ) ) 2 ] Var_D=E_D \left [(E_D[\hat{f}_D(x)]-\hat{f}_D(x))^2 \right ] VarD=ED[(ED[f^D(x)]f^D(x))2]
当模型的偏差比较大时,通常表示模型没有足够的表达力。无论采取怎样的训练样本进行训练,都不能使得模型拟合样本数据,模型的预测值与真实值有较大的差距,即欠拟合
当模型的方差比较大时,模型的表达力足够强,能很好地拟合所有训练样本,但是在未知样本上地预测非常不稳定,这种情况叫作欠拟合。这说明模型包含了超出真实问题地复杂度,过多的参数无法从有限的样本中获取充分的信息,这些参数就会自由摆动,从而扰动模型的预测结果,使模型表现得不稳定。
在这里插入图片描述
不同的集成学习方法分别从偏差和方差的角度降低模型的预测误差。
随机森林这类方法将若干方差较大的模型进行平均,降低了模型的方差。
而AdaBoost这样的方法将若干偏差大、方差小的模型进行加权叠加,以增加模型的表达力,减小模型的偏差。


总结

今天从梯度下降法开始,学习了梯度提升算法的实现,了解了它的数学一般表示形式。在梯度 下降法的基础上,运用迭代的思想,将不同的模型进行组合,就得到了梯度提升算法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器视觉系统光源的分类及选择

机器视觉系统 机器视觉系统是一种基于计算机视觉技术的智能系统,主要用于对图像或视频进行分析、处理和识别。一个典型的机器视觉系统通常由以下几个组成部分构成: 光源 机器视觉光源是机器视觉系统的关键组成部分之一。机器视觉光源直接影响图像质量&am…

Qt:窗口、按钮类、行编辑器、标签类

作业&#xff1a;QQ登录界面 mywidget.h #ifndef MYWIDGET_H #define MYWIDGET_H#include <QWidget> #include <QIcon> #include<QMovie> #include <QLabel> #include <QPushButton> #include <QLineEdit> class MyWidget : public QWid…

jest单元测试——项目实战

jest单元测试——项目实战 一、纯函数测试二、组件测试三、接口测试四、React Hook测试&#x1f4a5; 其他的疑难杂症另&#xff1a;好用的方法 &#x1f31f; 温故而知新&#xff1a;单元测试工具——JEST 包括&#xff1a;什么是单元测试、jest的基本配置、快照测试、mock函数…

加州大学欧文分校英语基础语法专项课程02:Questions, Present Progressive and Future Tenses 学习笔记

Questions, Present Progressive and Future Tenses Course Certificate 本文是学习 Questions, Present Progressive and Future Tenses 这门课的学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。 文章目录 Questions, Present Progressive and Future TensesWeek 01: …

大语言模型(LLM)为什么会产生幻觉?

一、幻觉的概念 在大语言模型&#xff08;LLM&#xff09;的语境之下&#xff0c;“幻觉”&#xff08;hallucination&#xff09;指的是模型在没有足够证据支持的情况下&#xff0c;生成的错误或虚构的信息。这种现象在自然语言处理&#xff08;NLP&#xff09;任务中尤其突出…

2024年MathorCup妈妈杯数学建模思路C题思路解析+参考成品

1 赛题思路 (赛题出来以后第一时间在群内分享&#xff0c;点击下方群名片即可加群) 2 比赛日期和时间 报名截止时间&#xff1a;2024年4月11日&#xff08;周四&#xff09;12:00 比赛开始时间&#xff1a;2024年4月12日&#xff08;周五&#xff09;8:00 比赛结束时间&…

jdk8新特性 方法引用

简介 lambda表达式是用来简化匿名内部类的方法引用 使用来简化 lambda表达式的 方法引用的标志 两个冒号 静态方法 静态方法 class CompareByAge {public static int compare(Student o1, Student o2) {return o1.getAge() - o2.getAge();} }静态方法引用 Arrays.sort(students…

游戏商业化活动通用测试点

备注:本文为博主原创文章,未经博主允许禁止转载。如有问题,欢迎指正。 个人笔记(整理不易,有帮助点个赞) 笔记目录:学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 个人随笔:工作总结随笔_8、以前工作中都接触过哪些类型的测试文档-CSDN博客 …

谷歌(Google)技术面试——在线评估问题(三)

谷歌&#xff08;Google&#xff09;面试过程的第一步&#xff0c;你可能会收到一个在线评估链接。 评估有效期为 7 天&#xff0c;包含两个编码问题&#xff0c;需要在一小时内完成。 以下是一些供你练习的在线评估问题。 在本章结尾处&#xff0c;还提供了有关 Google 面试不…

免费分享一套微信小程序在线订餐(点餐)配送系统(SpringBoot+Vue),帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序在线订餐(点餐)配送系统(SpringBootVue)&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序在线订餐(点餐)配送系统(SpringBootVue) Java毕业设计_哔哩哔哩_bilibili【免费】微信小程序在…

配置 施耐德 modbusTCP 分布式IO子站 PRA0100

模块官方介绍&#xff1a;https://www.schneider-electric.cn/zh/product/BMXPRA0100 1. 总体步骤 2. 软件组态&#xff1a;在 Unity Pro 软件中创建编辑 PRA 模块工程 2.1 新建项目 模块箱硬件型号如下 点击 Unity Pro 软件左上方【新建】按钮&#xff0c;选择正确的 DIO …

【C语言】如何判断一个机器的大小端

如何判断一个机器的大小端 一&#xff1a;什么是机器的大小端二&#xff1a;为什么会有大小端三&#xff1a;设计一个小程序来判断当前机器的大小端方法一&#xff1a;指针类型强转方法二&#xff1a;联合体 一&#xff1a;什么是机器的大小端 机器的大小端是指在内存中存储多…

C++ | Leetcode C++题解之第13题罗马数字转整数

题目&#xff1a; 题解&#xff1a; class Solution { private:unordered_map<char, int> symbolValues {{I, 1},{V, 5},{X, 10},{L, 50},{C, 100},{D, 500},{M, 1000},};public:int romanToInt(string s) {int ans 0;int n s.length();for (int i 0; i < n; i) …

Python项目1 外星人入侵

武装飞船 1 规划项目 开发大型项目时&#xff0c;做好规划后再动手编写项目很重要。规划可确保你不偏离轨道&#xff0c;从而提高项目成功的可能性。 下面来编写有关游戏《外星人入侵》的描述&#xff0c;其中虽然没有涵盖这款游戏的所有细节&#xff0c;但能让你清楚地知道…

文心一言上线声音定制功能;通义千问开源模型;openAI又侵权?

文心一言上线定制专属声音功能 百度旗下 AI 聊天机器人文心一言上线新功能&#xff0c;用户录音一句话&#xff0c;即可定制声音。 使用这项功能需要使用文心一言 App。在创建智能体中&#xff0c;点击创建自己的声音&#xff0c;朗读系统提示的一句话&#xff0c;等候几秒钟时…

工程中实践的微服务设计模式

大家好&#xff0c;我是 方圆。最近在读《微服务架构设计模式》&#xff0c;开始的时候我非常的好奇&#xff0c;因为在我印象中&#xff0c;设计模式是常说的那23种设计模式&#xff0c;而微服务的设计模式又是什么呢&#xff1f;这个问题也留给大家&#xff0c;在文末我会附上…

synchronized锁机制升级过程——面试题

1. 无锁状态 对象在没有被任何线程锁定时处于无锁状态。此时对象头中的锁标志位通常表示为无锁&#xff08;例如&#xff0c;标记字段的特定位组合表示无锁或偏向锁状态&#xff09;。 2. 偏向锁&#xff08;Biased Locking&#xff09; 初次获取&#xff1a;当线程首次获得…

谷粒商城实战(011 业务-检索服务)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第173p-第p194的内容 介绍 这些过滤条件都可以写在must里&#xff0c;但是filter不参与评分&#xff0c;速度会快一些&#xff0c;所以一些分类等…

【三十六】【算法分析与设计】综合练习(3),39. 组合总和,784. 字母大小写全排列,526. 优美的排列

目录 39. 组合总和 对每一个位置进行枚举 枚举每一个数出现的次数 784. 字母大小写全排列 526. 优美的排列 结尾 39. 组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不…

探索Python爬虫:解析网页数据的神奇之旅

在当今数字化时代&#xff0c;信息的获取变得比以往任何时候都更加便捷。然而&#xff0c;即使在互联网上&#xff0c;获取数据也需要通过正确的工具和技术。Python爬虫就是这样一种强大的工具&#xff0c;它可以让我们轻松地从互联网上收集数据&#xff0c;并将其转化为有用的…