集成学习-Adaboost

2023-11-17

Adaboost 算法简介

集成学习(ensemble learning)通过构建并结合多个学习器(learner)来完成学习任务,通常可获得比单一学习器更良好的泛化性能,特别是在集成弱学习器(weak learner)时。

集成学习两大类:
  • 以bagging、Random Forest等算法为代表的,各个学习器之间相互独立、可同时生成的并行化方法;
  • 以boosting、Adaboost等算法为代表的,个体学习器是串行序列化生成的、具有依赖关系,它试图不断增强单个学习器的学习能力。

算法详解

Adaboost步骤概览
  1. 初始化训练样本的权值分布,每个训练样本的权值相等(如果一共有N个样本,则每个样本的权值为1/N)
  2. 依次构造训练集并训练弱分类器。如果一个样本被准确分类,那么它的权值在下一个训练集中农会降低;相反,如果它分类错误,那么它在下一个训练集中的权值会提高。权值更新过后的训练集会用于训练下一个分类器。
  3. 训练好的弱分类器集成为一个强分类器集,误差率小的弱分类器会在最终的强分类器里占据更大的权重,否则较小。
Adaboost 算法流程

给定一个样本数量为m的数据集 T = { ( x 1 , y 1 ) , … , ( x m , y m ) } T=\left \{\left(x_{1}, y_{1}\right), \ldots,\left(x_{m}, y_{m}\right) \right \} T={(x1,y1),,(xm,ym)}yi 属于标记集合{-1,+1}。

训练集的在第k个弱学习器的输出权重为 D ( k ) = ( w k 1 , w k 2 , … w k m ) ; w 1 i = 1 m ; i = 1 , 2 … m D(k)=\left(w_{k 1}, w_{k 2}, \ldots w_{k m}\right) ; \quad w_{1 i}=\frac{1}{m} ; i=1,2 \ldots m D(k)=(wk1,wk2,wkm);w1i=m1;i=1,2m
​① 初始化训练样本的权值分布,每个训练样本的权值相同: D ( 1 ) = ( w 11 , w 12 , … w 1 m ) ; w 1 i = 1 m ; i = 1 , 2 … m D(1)=\left(w_{1 1}, w_{1 2}, \ldots w_{1 m}\right) ; \quad w_{1 i}=\frac{1}{m} ; i=1,2 \ldots m D(1)=(w11,w12,w1m);w1i=m1;i=1,2m
② 进行多轮迭代,产生T个弱分类器。

​ for t = 1, … , T :

​ a. 使用权值分布 D(t) 的训练集进行训练,得到一个弱分类器 G t ( x ) : χ → { − 1 , + 1 } G_{t}(x) : \quad \chi \rightarrow\{-1,+1\} Gt(x):χ{1,+1} ​ b. 计算 Gt(x) 在训练数据集上的分类误差率(其实就是被 Gt(x) 误分类样本的权值之和):
e t = P ( G t ( x i ) ≠ y i ) = ∑ i = 1 m w t i I ( G t ( x i ) ≠ y i ) e_{t}=P\left(G_{t}\left(x_{i}\right) \neq y_{i}\right)=\sum_{i=1}^{m} w_{t i} I\left(G_{t}\left(x_{i}\right) \neq y_{i}\right) et=P(Gt(xi)̸=yi)=i=1mwtiI(Gt(xi)̸=yi)
c. 计算弱分类器 Gt(x) 在最终分类器中的系数(即所占权重) α t = 1 2 ln ⁡ 1 − e t e t \alpha_{t}=\frac{1}{2} \ln \frac{1-e_{t}}{e_{t}} αt=21lnet1et ​ d. 更新训练数据集的权值分布,用于下一轮(t+1)迭代
D ( t + 1 ) = ( w t + 1 , 1 , w t + 1 , 2 , ⋯ w t + 1 , i ⋯   , w t + 1 , m ) D(t+1)=\left(w_{t+1,1} ,w_{t+1,2} ,\cdots w_{t+1, i} \cdots, w_{t+1, m}\right) D(t+1)=(wt+1,1,wt+1,2,wt+1,i,wt+1,m)
for i = 1, … , m :
w t + 1 , i = w t , i Z t × { e − α t ( i f G t ( x i ) = y i ) e α t ( i f G t ( x i ) ≠ y i ) = w t , i Z t exp ⁡ ( − α t y i G t ( x i ) ) w_{t+1,i}=\frac{w_{t,i}}{Z_{t}} \times \left\{\begin{array}{ll}{e^{-\alpha_{t}}} & {\text ({ if } G_{t}\left(x_{i}\right)=y_{i}}) \\ {e^{\alpha_{t}}} & {\text ({ if } G_{t}\left(x_{i}\right) \neq y_{i}})\end{array}\right. = \frac{w_{t,i}}{Z_{t}} \exp \left(-\alpha_{t} y_{i} G_{t}\left(x_{i}\right)\right) wt+1,i=Ztwt,i×{eαteαtifGt(xi)=yiifGt(xi)̸=yi=Ztwt,iexp(αtyiGt(xi))
其中 Zt是规范化因子,使得D(t+1)成为一个概率分布(和为1)
Z t = ∑ j = 1 m w t , i exp ⁡ ( − α t y i G t ( x i ) ) Z_{t}=\sum_{j=1}^{m} w_{t,i} \exp \left(-\alpha_{t} y_{i} G_{t}\left(x_{i}\right)\right) Zt=j=1mwt,iexp(αtyiGt(xi))

③ 集成T个弱分类器为1个最终的强分类器:
G ( x ) = sign ⁡ ( ∑ t = 1 T α t G t ( x ) ) G(x)=\operatorname{sign}\left(\sum_{t=1}^{T} \alpha_{t} G_{t}(x)\right) G(x)=sign(t=1TαtGt(x))

算法十问

1.Adaboost分类模型的学习器的权重系数 α \alpha α怎么计算的?

Adaboost是前向分步加法算法的特例,分类问题的时候认为损失函数指数函数.

  1. 当基函数是分类器时,Adaboost的最终分类器是: f ( x ) = ∑ m − 1 M α m G m ( x ) = f m − 1 ( x ) + α m G m ( x ) f(x)=\sum_{m-1}^{M}{\alpha_mG_m(x)}=f_{m-1}(x)+{\alpha_mG_m(x)} f(x)=m1MαmGm(x)=fm1(x)+αmGm(x)
  2. 目标是使前向分步算法得到的 α \alpha α G m ( x ) G_m(x) Gm(x)使 f m ( x ) f_m(x) fm(x)在训练数据集T上的指数损失函数最小,即 ( α , G m ( x ) ) = a r g m i n α , G ∑ i = 1 N e x p [ − y i ( f m − 1 ( x i ) + α G ( x i ) ) ] (\alpha, G_m(x))=arg min_{\alpha, G}\sum_{i=1}^{N}exp[-y_i(f_{m-1}(x_i)+\alpha G(x_i))] (α,Gm(x))=argminα,Gi=1Nexp[yi(fm1(xi)+αG(xi))] 其中, w ^ m i = e x p [ − y i f m − 1 ( x i ) ] . \hat{w}{mi}=exp[-y_i f{m-1}(x_i)]. w^mi=exp[yifm1(xi)].为了求上式的最小化,首先计算 G m ( x ) G_m(x) Gm(x),对于任意的 α > 0 \alpha>0 α>0,可以转化为下式: G m = a r g m i n G ∑ i = 1 N w ^ m i I ( y i ≠ G ( x i ) ) G_{m}=argmin_{G}\sum_{i=1}^{N}\hat{w}{mi}I(y_i \neq G(x_i)) Gm=argminGi=1Nw^miI(yi̸=G(xi)) 之后求 α m ∗ \alpha_m^* αm,将上述式子化简,得到 ∑ i = 1 N w ^ m i e x p [ − y i α G ( x i ) ] = ∑ y i = G m ( x i ) w ^ m i e − α + ∑ y i ≠ G m ( x i ) w ^ m i e α = ( e α − e − α ) ∑ i = 1 N w ^ m i I ( y i ≠ G ( x i ) ) + e − α ∑ i = 1 N w ^ m i \sum{i=1}^{N}\hat{w}{mi}exp[-y_i \alpha G(x_i)] = \sum{y_i =G_m(x_i)}\hat{w}{mi}e^{-\alpha}+\sum{y_i \neq G_m(x_i)}{\hat{w}{mi}e^{\alpha}} = (e^{\alpha} - e^{- \alpha})\sum{i=1}^{N}\hat{w}{mi}I(y_i \neq G(x_i)) + e^{- \alpha}\sum{i=1}^{N}\hat{w}{mi} i=1Nw^miexp[yiαG(xi)]=yi=Gm(xi)w^mieα+yi̸=Gm(xi)w^mieα=(eαeα)i=1Nw^miI(yi̸=G(xi))+eαi=1Nw^mi 将已经求得的 G m ( x ) G_m(x) Gm(x)带入上式面,对 α \alpha α求导并等于0,得到最优的 α \alpha α. a m = 1 2 l o g 1 − e m e m a_m=\frac{1}{2} log{\frac{1-e_m}{e_m}} am=21logem1em 其中 e m e_m em是分类误差率: e m = ∑ i = 1 N w ^ m i I ( y i ≠ G m ( x i ) ) ∑ i = 1 N w ^ m i = ∑ i = 1 N w ^ m i I ( y i ≠ G m ( x i ) ) e_m=\frac{\sum{i=1}^{N}\hat{w}{mi}I(y_i \neq G_m(x_i))}{\sum{i=1}^{N}\hat{w}{mi}}=\sum{i=1}^{N}\hat{w}_{mi}I(y_i \neq G_m(x_i)) em=i=1Nw^mii=1Nw^miI(yi̸=Gm(xi))=i=1Nw^miI(yi̸=Gm(xi))

2.Adaboost能否做回归问题?

Adaboost也能够应用到回归问题,相应的算法如下: 输入: T = ( x i , y 1 ) , ( x i , y 1 ) , . . . , ( x N , y N ) T={(x_i, y_1),(x_i, y_1),...,(x_N, y_N)} T=(xi,y1),(xi,y1),...,(xN,yN), 弱学习器迭代次数M。 输出:强分类器f(x).

  1. 初始化权重, D ( 1 ) = w 11 , w 12 , . . . , w 1 N ; w 1 i = 1 N ; i = 1 , 2 , . . , N D(1)={w_{11},w_{12},...,w_{1N}}; w_{1i}=\frac{1}{N}; i=1,2,..,N D(1)=w11,w12,...,w1N;w1i=N1;i=1,2,..,N
  2. 根据m=1,2,…,M;
    • 学习得到 G m ( x ) G_m(x) Gm(x)
    • 计算训练集上最大误差 E m = m a x ∣ y i − G m ( x i ) ∣ , i = 1 , 2 , . . , N E_m=max|y_i-G_m(x_i)|, i=1,2,..,N Em=maxyiGm(xi),i=1,2,..,N
    • 计算样本的相对平方误差: e m i = ( y i − G m ( x i ) ) 2 E m 2 e_{mi}=\frac{(y_i-G_m(x_i))^2}{E_m^2} emi=Em2(yiGm(xi))2
    • 计算回归误差率: e m = ∑ i = 1 N w m i e m i e_m=\sum_{i=1}^{N}w_{mi}e_{mi} em=i=1Nwmiemi
    • 计算若学习器系数: α m = e m 1 − e m \alpha_m=\frac{e_m}{1-e_m} αm=1emem
    • 更新样本权重: w m + 1 , i = w m i Z m α m 1 − e m , i w_{m+1,i}=\frac{w_{mi}}{Z_m}{\alpha_{m}^{1-e^{m,i}}} wm+1,i=Zmwmiαm1em,i 其中 Z m Z_m Zm是规范化因子, Z m = ∑ i = 1 m w m i α m 1 − e m , i Z_m=\sum_{i=1}^{m}w_{mi}{\alpha_{m}^{1-e^{m,i}}} Zm=i=1mwmiαm1em,i
  3. 得到强学习器: f ( x ) = ∑ m = 1 M G m ∗ ( x ) f(x)=\sum_{m=1}{M}G_{m}^*(x) f(x)=m=1MGm(x)
    注: 不管是分类问题还是回归问题,根据误差改变权重就是Adaboost的本质,可以基于这个构建相应的强学习器。

3.boosting和bagging之间的区别,从偏差-方差的角度解释Adaboost?

集成学习提高学习精度,降低模型误差,模型的误差来自于方差和偏差,其中bagging方式是降低模型方差,一般选择多个相差较大的模型进行bagging。boosting是主要是通过降低模型的偏差来降低模型的误差。其中Adaboost每一轮通过误差来改变数据的分布,使偏差减小。

4.为什么Adaboost方式能够提高整体模型的学习精度?

根据前向分布加法模型,Adaboost算法每一次都会降低整体的误差,虽然单个模型误差会有波动,但是整体的误差却在降低,整体模型复杂度在提高。

5.Adaboost算法如何加入正则项?

f m ( x ) = f m − 1 ( x ) + η α m G m ( x ) f_m(x)=f_{m-1}(x)+\eta \alpha_{m}G_{m}(x) fm(x)=fm1(x)+ηαmGm(x)

6.Adaboost使用m个基学习器和加权平均使用m个学习器之间有什么不同?

Adaboost的m个基学习器是有顺序关系的,第k个基学习器根据前k-1个学习器得到的误差更新数据分布,再进行学习,每一次的数据分布都不同,是使用同一个学习器在不同的数据分布上进行学习。加权平均的m个学习器是可以并行处理的,在同一个数据分布上,学习得到m个不同的学习器进行加权。

7.adabosot和gbdt之间的区别和相同?

Adaboost和gbdt都是通过减低偏差提高模型精度,都是前项分布加法模型的一种,不同的是,Adaboost每一个根据前m-1个模型的误差更新当前数据集的权重,学习第m个学习器;gbdt是根据前m-1个的学习剩下的label的偏差,修改当前数据的label进行学习第m个学习器,一般使用梯度的负方向替代偏差进行计算。

8.adaboost的迭代次数(基学习器的个数)如何控制?

一般使用earlystopping进行控制迭代次数。

9.adaboost算法中基学习器是否很重要,应该怎么选择基学习器?

sklearn中的adaboost接口给出的是使用决策树作为基分类器,一般认为决策树表现良好,其实可以根据数据的分布选择对应的分类器,比如选择简单的逻辑回归,或者对于回归问题选择线性回归。

10.MultiBoosting算法将Adaboost作为Bagging的基学习器,Iterative Bagging将Bagging作为Adaboost的基学习器。比较两者的优缺点?

两个模型都是降低方差和偏差。主要的不同的是顺序不同。MultiBosoting先减低模型的偏差再减低模型的方差,这样的方式 MultiBoosting由于集合了Bagging Wagging, AdaBoost,可以有效的降低误差和方差,特别是误差。但是训练成本和预测成本都会显著增加。 Iterative Bagging相比Bagging会降低误差,但是方差上升。由于Bagging本身就是一种降低方差的算法,所以Iterative Bagging相当于Bagging与单分类器的折中。

面试真题

1.分类器的权重系数α实际上是通过最小化指数损失函数的得到的,如果想了解 α 的 推导过程可以参考 Schapire 论文原文或者周志华《机器学习》8.2节内容。

2.对于无法接受带权样本的基学习算法,可以通过重采样resampling来产生训练集,这也是为什么之前说Adaboost可以理解为基于概率分布来选取样本。拿上面的例子来说,详细做法是:10个样本中每个样本被抽中的概率是Pi(i=1,…,10),现在按抽取概率连续做10次可放回的样本抽取,得到训练集即可训练出一个分类器。

3.adaboost的灵魂在于其样本权重更新(样本权重模拟了概率分布)的方法 以及 弱分类器加权组合。

4.Adaboost 的权值更新方法。

参考上面的算法介绍。

5.训练过程中,每轮训练一直存在分类错误的问题,整个Adaboost却能快速收敛,为何?

每轮训练结束后,AdaBoost 会对样本的权重进行调整,调整的结果是越到后面被错误分类的样本权重会越高。而后面的分类器为了达到较低的带权分类误差,会把样本权重高的样本分类正确。这样造成的结果是,虽然每个弱分类器可能都有分错的样本,然而整个 AdaBoost 却能保证对每个样本进行正确分类,从而实现快速收敛。

6.Adaboost 的优缺点?

​优点:能够基于泛化性能相当弱的的学习器构建出很强的集成,不容易发生过拟合。
缺点:对异常样本比较敏感,异常样本在迭代过程中会获得较高的权值,影响最终学习器的性能表现。

7.AdaBoost 与 GBDT 对比有什么不同?

区别在于两者boosting的策略:Adaboost通过不断修改权重、不断加入弱分类器进行boosting;GBDT通过不断在负梯度方向上加入新的树进行boosting。

参考资料

  1. 台湾清华大学李端兴教授2017年秋机器学习概论课程(CS 4602)PPT
  2. 周志华 《机器学习》第8章 集成学习
  3. July的博客
  4. http://fornlp.com/周志华-《机器学习》-答案整理
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

集成学习-Adaboost 的相关文章

  • Android总结之链式调用(方法链)

    前言 最近在学习总结Android属性动画的时候 发现Android的属性动画设计采用了链式调用的方式 然后又回顾了一下了以前接触的开源框架Glide也是采用链式调用的方式 还有最近火的一塌糊涂的RxJava也是采用链式调用 为何如此之多的
  • STM32---stm32f103c8t6与stm32f103zet6之间的代码移植转换

    目录 一 将c8t6转换为zet6 1 修改启动文件 2 修改芯片 3 将MD修改为HD 4 下载器的修改 5 修改完成 编译成功 二 将zet6转换为c8t6 一 将c8t6转换为zet6 1 修改启动文件 最终结果如下 2 修改芯片 将
  • RedHat8(RHEL8)超详细安装教程--图文解说版

    目录 一 RHEL8介绍 二 产品地址 三 安装 1 文件 gt 新建虚拟机 快捷键 Ctrl N 2 这里我们选择 自定义 即可 gt 下一步 3 兼容性 保持默认 gt 下一步 4 稍后安装 gt 下一步 5 选择 Linux 操作系统
  • OBJ转GLTF

    obj转gltf的方法较多 这里采用cesium 1 下载cesuim开发包 2 进入cesium根目录 npm下载obj2gltf 没有npm的 自行安装 npm install obj2gltf save 3 将 obj mlt等文件复
  • 数据挖掘学习

    文章目录 绪论 定义 挖掘过程 数据准备 数据探索EDA 数据仓库 空间数据库 时间数据库和时序数据库 流数据 异构数据和遗产数据 数据挖掘的模式 数据准备 数据组成 什么是数据对象 什么是数据属性 数据搜集 数据质量分析 数据类型 考点
  • 国产操作系统产业

    操作系统是计算机的灵魂 目前国外操作系统品牌几乎垄断了巨大的中国市场 其中在桌面端 移动端的市占率分别超过94 75 98 86 根据Gartner的统计数据 2018年中国的操作系统市场容量在189亿以上 其中国外操作系统品牌几乎在中国市
  • Gossip协议

    Gossip协议 一 Gossip协议 1 1 工作原理 1 2 Gossip优点 1 3 Gossip传播方式 1 3 1 Anti Entropy 反熵 1 3 2 Rumor Mongering 谣言传播 1 3 3 结合 1 4 G
  • 初识C语言(二)

    目录 五 字符串 六 转义字符 七 注释 7 1注释的类型 7 1 1单行注释 7 1 2多行注释 7 2注释的使用方法 7 2 1解释代码功能注释 7 2 2提供代码示例注释 7 2 3禁用或屏蔽代码 八 选择语句 8 1if语句 8 1
  • 利用python3自动在36kr里查找自己感兴趣的内容

    最近常常在36kr网站的快讯及资讯 最新里查看自己感兴趣内容的及时信息 由于快讯及资讯 最新里信息更新得比较及时快速 自己也很难一直盯着看 故想着要是写个脚本让其自动在后天挂着每隔5分钟查询一次 有的话就写入txt档中并在控制台打印出来 这
  • 小孩学创客编程好还是学机器人好

    小孩学创客编程好还是学机器人好 小孩的学习一直都是很多家长们非常关心和重视的一件事情 很多的家长在培养孩子的学习的时候 可以说是十分的用心的 会给孩子选择一些能够有利于孩子成长的课程 就拿现在很多的家长想要孩子去学习机器人编程的课程来说 有
  • 域环境的搭建的详细教程-220109

    参考链接 https mp weixin qq com s src 11 timestamp 1641696209 ver 3547 signature zTIDZEcpq zjwuEuZpbaaAxFfkkVxcLHeX4AuKT78bJ
  • 第九届蓝桥杯 2018年省赛真题 (Java 大学C组 )

    蓝桥杯 2018年省赛真题 Java 大学C组 第一题 哪天返回 第二题 猴子分香蕉 第三题 字母阵列 第四题 第几个幸运数 第五题 书号验证 第六题 打印大X 第七题 缩位求和 第八题 等腰三角形 第九题 小朋友崇拜圈 第十题 耐摔指数
  • RHCE——DNS的正反向解析

    一 实验要求 DNS配置正反向解析 二 实验过程 1 安装软件包 root localhost ll yum install bind y 2 备份bind软件的的配置文件 root localhost yum repos d cp a e

随机推荐

  • CMAKE学习——编译多个文件 & 多个目录

    大型工程会有很多文件 包括类的实现和定义 各种不同的模块交叉在一起 我们怎么用cmake方便的编译呢 例如有这么一个工程 我们现在想要编译的话 如果只选择了main cpp 则会提示 未定义的引用 因为我们头文件和实现分离 但我们只包含了头
  • 【云原生之Docker实战】使用Docker部署jenkins持续集成工具

    云原生之Docker实战 使用Docker部署jenkins持续集成工具 一 jenkins介绍 1 jenkins简介 2 jenkins功能 3 jenkins基本工作图 二 检查本地系统版本 三 检查本地docker状态 1 检查do
  • IDEA运行报错:类文件具有错误的版本 55.0, 应为 52.0 请删除该文件或确保该文件位于正确的类路径子目录中。

    IDEA运行报错 类文件具有错误的版本 55 0 应为 52 0 请删除该文件或确保该文件位于正确的类路径子目录中 如果搜索资料 会看到minor major版本 但其实不叫这个名字 Sun公司会在大的版本升级时增加major数字 小更新或
  • 【python】自动化测试框架--nose

    目录 一 准备 二 nose介绍 三 看个简单的例子了解下 三 nose常用命令简单介绍 1 查看所有nose相关命令 2 执行并捕获输出 3 提供XUnit XML 格式的测试结果 并存储在nosetests xml文件中 主要为jenk
  • 程序员的自我修养--链接、装载与库

    中国科学技术大学软件学院 周艾亭 原创作品版权所有转载请注明出处 第一次接触 程序员的自我修养 的时候 的确怀有一种疑惑的态度的 因为潜意识告诉我 在计算机这一行 更强调的是实践动手 而XXX修养的显然不属于动手操作类 至少不是太适合我的需
  • 数据同步方案

    mysql 数据同步到elastic中 本文中不提及实现 仅提供方案 增量数据同步 方案一 通过logstash 官方提供的工具 快速实现数据同步 值得注意的是选择logstash时需要和elastic的版本做对应 由于elastic 版本
  • 多线程经典案例(生产者--消费者)

    多线程开发中有一个经典的操作案例 就是 生产者 消费者 案例 生产者不的生产产品 消费者不断地取走产品 此案例涉及线程同步 线程休眠 线程等待 线程唤起等操作以及之间是如何搭配使用的方法 示例讲解 本示例模拟中生产者由 厨师 担任 消费者由
  • 如何利用 Selenium 对已打开的浏览器进行爬虫

    大家好 在对某些网站进行爬虫时 如果该网站做了限制 必须完成登录才能展示数据 而且只能通过短信验证码才能登录 这时候 我们可以通过一个已经开启的浏览器完成登录 然后利用程序继续操作这个浏览器 即可以完成数据的爬取了 具体操作步骤如下 1 1
  • QT循环队列实时处理数据(二)

    上一篇多线程介绍的是 QT多线程处理机制 这篇 将对接收数据 实时处理进行分析 QT通过socket通信 从接收缓冲区中读取数据 交给线程进行处理 那么问题来了 如果线程还没有处理完数据 则线程就没有办法继续从缓冲区中取数 那么当数据量过大
  • vue父子组件之间的传值(子传父,父传子)

    vue父子组件之间的传值 子传父 父传子 前提首先需要了解vue中组件之间的父子关系 主组件mainPage vue
  • 个性化定制界面和极简版原装界面,哪一个你用起来更加顺手呢

    个性化定制界面是根据用户的需求和喜好进行定制的 具有很高的灵活性和可定制性 用户可以自由选择界面的颜色 布局 字体等 以及添加或删除特定功能 这种界面能够根据用户的个人喜好和习惯进行定制 使得用户在使用过程中更加舒适和顺手 以下是一些可能的
  • 【数据结构】&&【C++】平衡搜索二叉树的模拟实现(AVL树)

    数据结构 C 平衡搜索二叉树的模拟实现 AVL树 一 AVL树的性质 二 AVL树的模拟实现 AVL树结点的定义 AVL树的插入 平衡因子的更新 左单旋 右单旋 双旋 左右旋 右左旋 AVL树的删除 检查是否是AVL树 三 完整代码 一 A
  • Tp5 left join 带条件 数据不返回

    背景 下面两种方式都是在查询吸毒人员的基本信息 pa account 表示该吸毒人员的评估小组 一般情况下 录入吸毒人员基础信息都会录入其关联的评估小组 但是部分也不录入 理论上 无论评估小组有没有录入 left join 都要返回左表ad
  • 微信小程序:日历模块页面

    文章目录 1 前言 2 功能需求 3 界面展示 4 部分代码展示 5 结语 完整项目下载 下载链接 1 前言 在制作背单词打卡小程序中 用户需要方便地查看历史学习信息 为了使页面美观并保持交互简洁 采用日历作为日期选择器是极为必要的 本指南
  • nginx中间件常见漏洞总结

    nginx中间件常见漏洞总结 1 中间件漏洞的概念 1 1 中间件 容器 服务器的基本概念辨析 2 Nginx 配置错误导致漏洞 2 1 uri 导致的CRLF注入漏洞 2 1 1 漏洞成因 2 1 2 利用方式 2 1 3 修改方案 2
  • 程序员必备技能-使用git把github的代码下载到本地使用

    在代码的学习过程中 难免需要看下github上的优秀项目 或者在参加某个培训班的时候 老师的示例代码存放在github中 想在本地的IDE中跑跑试试 这篇文章提供一个简单的获取github项目在自己的IDE中打开的方法 目录 一 获取git
  • STM32F103ZET6【HAL开发】STM32CUBEMX------3.2高级定时器输出带死区的互补PWM

    一 STM32F103只有高级定时器才能输出互补的PWM波形 定时器的对应IO如下表 二 下面以TIM1为例 演示三对带死区的PWM波形在STM32CUBEMX里面的配置 TIM1 CH1 TIM1 CH1N TIM1 CH2 TIM1 C
  • [matlab]10种经典的时间序列预测模型

    matlab 10种经典的时间序列预测模型 本文演示了 10 种不同的经典时间序列预测方法 它们是 自回归 AR 移动平均线 自回归移动平均线 自回归积分移动平均线 ARIMA 季节性自回归积分移动平均线 SARIMA 具有外生回归量的季节
  • R语言3.11 因子分析因子旋转

    因子旋转 目的 寻找每个主因子的实际意义 如果各主因子的典型代表变量不突出 就需要进行旋转 使因子载荷矩阵中载荷的绝对值向0和1两个方向分化 方法 正交旋转Varimax 最大方差正交旋转 斜交旋转Promax Fa2 factanal X
  • 集成学习-Adaboost

    Author 鲁力 Email jieyuhuayang foxmail com Datawhale Adaboost 算法简介 集成学习 ensemble learning 通过构建并结合多个学习器 learner 来完成学习任务 通常可