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

news2024/11/16 16:43:37

系列文章目录

第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这样的方法将若干偏差大、方差小的模型进行加权叠加,以增加模型的表达力,减小模型的偏差。


总结

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

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

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

相关文章

二分法题集2

目录 1 山脉数组的峰顶索引 分析: 代码展示: 2 寻找峰值 分析: 代码展示: 3 寻找旋转排序数组中的最小值 分析: 代码展示: 4 点名 分析: 代码展示: 1 山脉数组的峰顶…

【代码随想录】哈希表

文章目录 242.有效的字母异位词349. 两个数组的交集202. 快乐数1. 两数之和454. 四数相加 II383. 赎金信15. 三数之和18. 四数之和 242.有效的字母异位词 class Solution {public boolean isAnagram(String s, String t) {if(snull || tnull || s.length()!t.length()){return …

Linux信号机制:进程间高效传递事件与操控指令的桥梁

在Linux操作系统中,信号是一种进程间通信机制,用于通知进程某些事件的发生或请求进程执行特定的动作。信号分为两类:编号1至31的传统UNIX信号,被称为不可靠信号,以及编号32至63的扩展信号,即可靠信号&#…

CMU15/445 2023 Spring-project1 LRU-K 替换策略

在写个demo之前,专门学习了LRU:【LeetCode刷题】146. LRU 缓存-CSDN博客 使用哈希表 双向链表可以满足删除/增加的时间复杂度为O(1)。 在通读完15/445这块的说明之后,发现和LRU还是有些差别的。 官方文档中对LRU-K的解释是:LRU-K算法根据所…

LABVIEW--正弦+高斯噪声信号及滤波

前面板信号 后面板 LABVIEW源程序链接:https://pan.baidu.com/s/11B-75i4fHZwWQyjxn9yCyQ?pwd7tfj 提取码:7tfj

JavaWeb--JavaScript Part 01

1. JavaScript概述 JavaScript(简称JS)是一种轻量级的、解释执行的客户端脚本语言,主要用于增强网页的交互性和动态性。它起源于Netscape的LiveScript,并在1995年发布时更名为JavaScript。尽管名称中包含"Java"&#xf…

2024.4.3-day08-CSS 盒子模型(溢出显示、伪元素)

个人主页:学习前端的小z 个人专栏:HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 作业 2024.4.3-学习笔记css溢出显示单行文本溢出显示省略号多行文本溢出显示省…

时序预测 | Python实现BiGRU-RELM时间序列预测

时序预测 | Python实现BiGRU-RELM时间序列预测 目录 时序预测 | Python实现BiGRU-RELM时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 BiGRU-RELM时间序列预测分析 将BiGRU和RELM两种模型进行了融合,BiGRU进行预测,RELM对BiGRU模型的预…

LED点阵屏与LCD1602

目录 LED点阵屏 点阵屏的介绍 LED点阵屏分类 点阵屏的显示原理 点阵案例 静态案例 电路图 keil文件 动态案例 电路图 keil文件 LCD1602 LCD1602概述 LCD1602内部结构 存储器结构 LCD引脚及应用电路 时序结构 LCD1602指令集 LCD1602编程 初始化 显示字符 …

使用libibverbs构建RDMA应用

本文是对论文Dissecting a Small InfiniBand Application Using the Verbs API所做的中英文对照翻译 Dissecting a Small InfiniBand Application Using the Verbs API Gregory Kerr∗ College of Computer and Information ScienceNortheastern UniversityBoston, MAkerrgccs…

三防笔记本丨工业笔记本电脑丨助力测绘行业的数字化转型

测绘行业测绘行业一直是高度技术化的领域,其重要性在于为建设、规划和资源管理提供准确的地理数据。然而,随着技术的发展,传统的测绘方法已经难以满足对数据精度和实时性的要求。因此,测绘行业正逐渐向数字化转型,采用…

唯美首页纯静态html5引导页源码,格子化win8风格官方引导页面源码

唯美首页纯静态html5引导页源码,格子化win8风格官方引导页面源码,喜欢的朋友可以拿去使用 源码下载 唯美首页纯静态html5引导页源码

Rust 基础语法和数据类型

数据类型 Rust提供了一系列的基本数据类型,包括整型(如i32、u32)、浮点型(如f32、f64)、布尔类型(bool)和字符类型(char)。此外,Rust还提供了原生数组、元组…

记忆的方法 简单易行的记忆技巧:归纳整理,联想,重点标注压缩,改错,留痕记念(去个地方买个特别能长久保留的纪念品),差异

记忆的方法有很多,以下是一些简单易行的记忆技巧: 分类整理:将需要记忆的信息进行分类,这样可以帮助你更好地组织和记忆信息。例如,尝试记住一组词语时,可以将它们按照类别或相关性分组。归纳整理。间隔重…

mysql的安装和部署

##官网下载mysql 我下载的是一个mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz 可以通过xshell 或者xftp传送 xshell则是先下载一个lrzsz 执行以下的命令 yum install lrzsz -y #安装好我下面有个一键安装的脚本 #!/bin/bash#解决软件的依赖关系 yum install cmake ncurses…

LangChain学习笔记—RAG(检索增强生成)

LangChain LangChain是一个软件开发框架,可以更轻松地使用大型语言模型(LLM)创建应用程序。它是一个具有 Python 和 JavaScript 代码库的开源工具。LangChain 允许开发人员将 GPT-4 等 LLM 与外部数据相结合,为聊天机器人、代码理…

代理IP在爬虫中的连接复用与开销减少

目录 一、引言 二、代理IP的基本概念 三、代理IP在爬虫中的使用 四、代理IP的连接复用 五、减少开销的策略 六、代码示例与注释 七、总结 一、引言 在爬虫开发中,代理IP的使用是常见的做法,尤其在目标网站设置了反爬虫机制时。代理IP能够帮助爬虫…

【鸿蒙 HarmonyOS】获取设备的地理位置

一、背景 获取移动设备的地理位置,包含:经度、维度、具体地理位置等,地理位置信息能在许多业务场景中被应用,如导航、地图服务、位置服务、社交媒体等。 下面以一个Demo例子,来实现获取设备地理位置的功能 官方文档…

27.WEB渗透测试-数据传输与加解密(上)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:26.WEB渗透测试-BurpSuite(五) BP抓包网站网址:http:…

经济学 赋税

赋税: 1.为政府服务提供金钱来源 2. 用于保护环境 3.帮助国家使用财政和货币政策,推动经济增长 4.再分配社会财富的一种方式,平衡富人和穷人的贫富差距 5.帮助我们支付市场自身可能无法实现的服务,比如公共安全,国…