整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

关于BOOST电路详解,建议收藏

于BOOST话题,很多电源工程师工作中会遇到不同的问题。其实找到问题的根源,才能对症下药。下面给大家分享几篇不错的文章,供大家学习~


详解buck boost buck-boost的电路基础

本文主要讲了三种基础拓扑(buck boost buck-boost)的电路基础,以及BUCK的电路,设计的案例,下面就随小编来看看吧。

一 三种基础拓扑(buck boost buck-boost)的电路基础:

1 电感的电压公式 = ,推出ΔI=V×ΔT/L

2 sw闭合时,电感通电电压VON,闭合时间tON sw关断时,电感电压VOFF,关断时间tOFF

3 功率变换器稳定工作的条件:ΔION=ΔIOFF即,电感在导通和关断时,其电流变化相等。那么由1,2的公式可知,VON =L×ΔION/ΔtON ,VOFF =L×ΔIOFF/ΔtOFF ,则稳定条件为伏秒定律:VON×tON=VOFF×tOFF

4 周期T,频率f,T=1/f,占空比D=tON/T=tON/(tON+tOFF)→tON=D/f =TD

→tOFF=(1-D)/f

二 Buck电路

5 电容的输入输出平均电流为0,在整个周期内电感平均电流=负载平均电流,所以有:IL=Io

6 二极管只在sw关断时流过电流,所以ID=IL×(1-D)

7 则平均开关电流Isw=IL×D

8 由基尔霍夫电压定律知:

Sw导通时:VIN =VON+VO+VSW → VON=VIN-VO- VSW≈VIN-VO假设VSW相比足够小

VO=VIN-VON-VSW≈VIN-VON

Sw关断时:VOFF =VO+VD → VO=VOFF-VD≈VOFF 假设VD相比足够小

9 由3、4可得D=tON/(tON+tOFF)=VOFF/(VOFF + VON)

由8可得:D=VO/{(VIN-VO)+VO}

D=VO/ VIN

10 直流电流IDC=电感平均电流IL,即IDC≡IL=Io 见5

11 纹波电流IAC=ΔI/2=VIN(1-D)D/ 2Lf=VO(1- D)/2Lf

由1,3、4、9得,

ΔI=VON×tON/L

=(VIN-VO)×D/Lf=(VIN-DVIN)×D/Lf=VIN(1- D)xD/ Lf

ΔI/ tON=VON/L=(VIN-VO)/L

ΔI=VOFF×tOFF/L

=VOT(1-D)/L

=VO(1-D)/Lf

ΔI/ tOFF=VOFF/L=VO/L

12,电流纹波率r=ΔI/ IL=2IAC/IDC 在临界导通模式下,IAC =IDC,此时r=2 见P51

r=ΔI/ IL=VON×D/Lf IL=(VIN-VO)×D/Lf IL

=VOFF×(1-D)/Lf IL=VO×(1-D)/Lf IL

13,峰峰电流IPP=ΔI=2IAC=r×IDC=r×IL

14,峰值电流IPK=IDC+IAC=(1+r/2)×IDC=(1+r/2) ×IL=(1+r/2)×IO

最恶劣输入电压的确定:

VO、Io不变,VIN对IPK的影响:

D=VO/ VIN VIN增加↑→D↓→ΔI↑, IDC=IO,不变,所以 IPK↑。

三 设计案例

某型号的DC-DC集成电路输入电压范围是4.7-16V,现在有个电路用它来把12V转为3.3V,最大输出电流是2A。如果开关频率是500KHZ,那么电感的推荐值是多大……

原文链接:https://www.dianyuan.com/article/45477.html


浅析四开关Buck-Boost电路及变换器

在非隔离电源方案中,Buck、Boost、Buck-Boost电路应用非常广泛,很多工程师都对这三种电路非常熟。下面我们一起看下四开关Buck-Boost电路。

常规的Buck-Boost电路,Vo=-Vin*D/(1-D),输出电压的极性和输入电压相反。

简要的四开关Buck-Boost电路,Vo=Vin*D/(1-D),输出电压的极性与输入电压相同。

四开关buck-boost的拓扑很简单,如下图。

对于四开关buck-boost,它本身有一种非常传统简单的控制方式。

那就是Q1和Q3同时工作,Q2和Q4同时工作。并且两组MOS交替导通,如上图。

如果把Q2和Q4换成二极管,那么也是同样能工作,只不过没有同步整流而已。

对于这种控制方式,在CCM情况下我们可以得到公式:

Vin*D=Vout(1-D)也就是说,Vout=Vin*D/(1-D). 这个电压转换比和我们常见的buck-boost是一样的。

只不过常见的buck-boost的输出电压是负压,而四开关输出的是正压。

但是这种控制方式的优点是简单,没有模态切换。但是缺点是,四个管子都在一直工作,损耗大,共模噪音也大。

基于传统控制方式的缺点。多年前,一家知名的IC公司推出了一款控制IC,革新了这个拓扑的控制方式。

但是,这种思路本身没什么奇特之处。真正有技术含量的是,当VIn=Vout的时候,采用怎么样的控制方式?

从buck过渡到中间模态,再过渡到boost的时候,如何做到无缝切换? 这几个问题,后来成为各家IC公司,大开脑洞,争夺知识产权的战场。

接下来,我来介绍某特公司的IC的控制逻辑。

先假设输出为固定的12V,输入假设为一个电池,充满电电压为16V,放电结束电压为8V。

那么从输入16V开始,此时的工作状态显然是BUCK

那么四个管子的驱动信号如下图

那么当输入电池电压逐渐开始降低,M1的占空比也逐渐开始增大,而M2的占空比开始减小。

此时M2的占空比是个关键的参数。

因为IC内部对M2的脉宽有个最小设定,假如说是200ns。

那么现在假设输入电压掉到12.5V,而M2的脉宽也收缩到了200ns。IC内部的逻辑电路就认为到了模态切换的时候了。

此时发生的变化是,M3和M4两个管子不再是常关和常通的状态,而是开始开关了。

如果我们把上图进行分解,就会发现一个有趣的现象,就是在一个clock周期里面,前半周期是buck,后半周期是boost……

原文链接:https://www.dianyuan.com/article/43788.html


四招,让你的Boost电路更安全!

电源最常见的三种结构布局是降压(buck)、升压(boost)和降压–升压(buck-boost),这三种布局都不是相互隔离的。

今天介绍的主角是boost升压电路,the boost converter(或者叫step-up converter),是一种常见的开关直流升压电路,它可以使输出电压比输入电压高。

下面主要从基本原理、boost电路参数设计、如何给Boost电路加保护电路三个方面来描述。

Part1 Boost电路的基本原理分析

Boost电路是一种开关直流升压电路,它能够使输出电压高于输入电压。在电子电路设计当中算是一种较为常见的电路设计方式。

首先,你需要了解的基本知识:

电容阻碍电压变化,通高频,阻低频,通交流,阻直流;

电感阻碍电流变化,通低频,阻高频,通直流,阻交流;

假定那个开关(三极管或者MOS管)已经断开了很长时间,所有的元件都处于理想状态,电容电压等于输入电压。

下面要分充电和放电两个部分来说明这个电路。

充电过程

在充电过程中,开关闭合(三极管导通),等效电路如上图,开关(三极管)处用导线代替。这时,输入电压流过电感。二极管防止电容对地放电。由于输入是直流电,所以电感上的电流以一定的比率线性增加,这个比率跟电感大小有关。随着电感电流增加,电感里储存了一些能量。

放电过程

如上图,这是当开关断开(三极管截止)时的等效电路。当开关断开(三极管截止)时,由于电感的电流保持特性,流经电感的电流不会马上变为0,而是缓慢的由充电完毕时的值变为0。而原来的电路已断开,于是电感只能通过新电路放电,即电感开始给电容充电,电容两端电压升高,此时电压已经高于输入电压了。升压完毕。

说起来升压过程就是一个电感的能量传递过程。充电时,电感吸收能量,放电时电感放出能量。如果电容量足够大,那么在输出端就可以在放电过程中保持一个持续的电流。如果这个通断的过程不断重复,就可以在电容两端得到高于输入电压的电压……

原文链接:https://www.dianyuan.com/article/41704.html


Boost电路仿真方法简析之空间状态平均法

对Boost电路进行相应的仿真测试,是工程师在平时最常接触的工作。通过空间状态平均法进行仿真测试和波形检测,能够快速有效的完成Simulink数字建模和检测工作。本文将会就这一方法展开简要介绍与分析,帮助工程师更轻松的实现建模和仿真检测。

首先我们以Boost电路结构的变换器为例,来看一下如何使用空间状态平均法进行公式计算。在计算中,工程师可以依据其拓扑结构,分别写出Boost电路变换器开通和关断状态方程。因为每一个开关周期都是非常短暂的,所以我们在一个开关周期内用空间状态平均法来综合两个阶段的方程,可得到一个有关输出电压和开关频率的非线性状态方程。

当开关导通时,Boost状态方程式为:

当开关关断时,Boost状态方程式为:

对上述两个公式用时间平均可得:

在上述公式中,参数U0代表输出电压;Ts代表开关周期;ton代表开通时间;toff代表关断时间;Uin代表输入电压;IL代表电感电流。在得出相应的数值之后,工程师可以用Simulink技术进行数学建模,建模结果如下图所示。

图为空间状态平均法的Boost电路变换器仿真模型

该模型中各个参数的计算过程如下:

在完成公式计算并进行建模后,工程师利用该方法所得到的Boost变换器正常运转的仿真波形如下图所示:

图为空间状态平均法的Boost电路变换器仿真波形

以上就是本文关于使用空间状态平均法进行Boost电路仿真检测的介绍,希望能够帮助工程师更好的完成电路系统仿真检测工作……

原文链接:https://www.dianyuan.com/article/31006.html


意犹未尽,查看更多精彩文章→→https://www.dianyuan.com/eestar/

更多精彩内容→→

PWM不过如此,你还在为PWM发愁?

反激就是这么回事,你入门了吗?

反激→就是这样的过程,搞不懂的快来GET

想快速学EMC,以下六篇文章足矣,建议收藏

读懂这八篇文章,想不懂PWM都难

者:symonxiong,腾讯 CDG 应用研究员

XGBoost是一种经典的集成式提升算法框架,具有训练效率高、预测效果好、可控参数多、使用方便等特性,是大数据分析领域的一柄利器。在实际业务中,XGBoost经常被运用于用户行为预判、用户标签预测、用户信用评分等项目中。XGBoost算法框架涉及到比较多数学公式和优化技巧,比较难懂,容易出现一知半解的情况。由于XGBoost在数据分析领域实在是太经典、太常用,最近带着敬畏之心,对陈天奇博士的Paper和XGBoost官网重新学习了一下,基于此,本文对XGBoost算法的来龙去脉进行小结。

本文重点解析XGBoost算法框架的原理,希望通过本文能够洞悉XGBoost核心算法的来龙去脉。对于XGBoost算法,最先想到的是Boosting算法。Boosting提升算法是一种有效且被广泛使用的模型训练算法,XGBoost也是基于Boosting来实现。Boosting算法思想是对弱分类器基础上不断改进提升,并将这些分类器集成在一起,形成一个强分类器。简而言之,XGBoost算法可以说是一种集成式提升算法,是将许多基础模型集成在一起,形成一个很强的模型。这里的基础模型可以是分类与回归决策树CART(Classification and Regression Trees),也可以是线性模型。如果基础模型是CART树(如图1所示),比如第1颗决策树tree1预测左下角男孩的值为+2,对于第1颗决策树遗留下来的剩余部分,使用第2颗决策树预测值为+0.9,则对男孩的总预测值为2+0.9=2.9。

图1.基于二叉树的XGBoost模型

XGBoost算法框架可以分为四个阶段来理解(如图2所示)。第一个阶段,如何构造目标函数? 在进行优化求解时,首先需要构造目标函数,有了目标函数才能进行优化求解。这种思路和LR模型(Logistic Regression)是一致。在LR模型中,首先,对于回归问题构造平方项损失,对于分类问题构造最大似然损失作为目标函数,然后基于构造好的目标函数,才会考虑采用梯度下降算法进行优化求解,比如随机梯度下降、Mini-Batch批量梯度下降、梯度下降等。在这个阶段,我们可以得到XGBoost的基本目标函数结构。

第二个阶段,目标函数优化求解困难,如何对目标函数近似转换? 在第一个阶段得到的基本目标函数较为复杂,不是凸函数,没法使用连续性变量对目标函数直接优化求极值。因此,使用泰勒级数对目标函数进行展开,对目标函数规整、重组后,将目标函数转换为关于预测残差的多项式函数

第三个阶段,如何将树的结构引入到目标函数中? 第二个阶段得到的多项式目标函数是一个复合函数。被预测的残差和模型复杂度还是未知的函数,需要对这两个函数进行参数化表示,即将决策树的结构信息通过数学符号表示出来。在第三个阶段,在树的形状确定情况下,可以优化求解出局部最优解。

第四个阶段,如何确定树的形状,要不要使用贪心算法? 如何在模型空间里面寻找最优的决策树形状,这是一个NP-Hard问题,我们很难对可能存在的树结构全部罗列出来,尤其在特征个数很多情况下。因此,在这里需要使用贪心算法来求得局部最优解。

图2.XGBoost算法构建逻辑

1.如何构造目标函数?

当使用多棵树来预测时,假设已经训练了棵树,则对于第个样本的(最终)预测值为:

在公式1中, 表示对 个样本的预测值,属于集合范围内, 表示通过第棵树对第个样本进行预测,比如第1棵树预测值为,第2棵树预测值为 ,依次类推,将这些树的预测值累加到一起,则得到样本的最终预测值。因此,如果要得到样本的最终预测值,需要训练得到棵树。

如果要训练得到棵树,首先需要构造训练的目标函数(如公式2所示)。在构建模型时,不仅需要考虑到模型的预测准确性,还需要考虑到模型的复杂程度,既准确又简单的模型在实际应用中的效果才是最好的。因此,目标函数由两部分构成,第一部分表示损失函数,比如平方损失、交叉熵损失、折页损失函数等。第一部分表示个样本总的损失函数值。因为在这里通过样本预测值和样本真实值的比较,可以计算出针对样本的模型预测损失值。这里可以暂时先不用考虑损失函数的具体形式,因为这里的损失函数,可以统一表示回归与分类问题的损失函数形式。

公式2的第二部分表示正则项,是用来控制模型的复杂度,模型越复杂,惩罚力度越大,从而提升模型的泛化能力,因为越复杂的模型越容易过拟合。XGBoost的正则化思路跟模型中加/正则化思路一致,不同的地方在于正则化项具体物理含义不同。在这里表示第棵树的复杂度,接下来的问题是如何对树的复杂度进行参数化表示,这样后面才能进行参数优化。

在损失函数中,是有很多个模型(决策树)共同参与,通过叠加式的训练得到。如图2所示,训练完第一颗树后,对于第一棵树没有训练好的地方,使用第二颗树训练,依次类推,训练第个棵树,最后训练第颗树。当在训练第棵树时,前面的第1棵树到第颗树是已知的,未知的是第棵树,即基于前面构建的决策树已知情况下,构建第棵树

图3.XGBoost叠加式训练

对于样本,首先初始化假定第0棵树为,预测值为,然后在第0棵树基础上训练第1棵树,得到预测值,在第1棵树基础上训练第2颗树,又可以得到预测值,依次类推,当训练第棵树的时候,前面棵树的总预测值为,递推训练具体过程如下所示:

根据XGBoost的递推训练过程,每棵决策树训练时会得到样本对应的预测值,根据样本预测值和真实值比较,可以计算得到模型预测损失值。又因为训练所得的每棵决策树都有对应的结构信息,因此可以得到每棵决策树的复杂度。根据这些信息,可以对目标函数公式2进行简化,得到公式3。

在公式3中,表示训练样本个数,为颗决策树累加的预测值,为颗决策树总的复杂度,在训练第颗决策树时,这两个东西是已知的,即在对目标函数进行求最小值优化时候,和为已知。因此,将常数项拿掉,得到公式4作为XGBoost的目标函数。

2.目标函数优化困难,如何对函数近似转换?

在公式4中,已经得到了需要优化的目标函数,这个目标函数已经是简化后的函数。对于公式4,没法进行进一步优化。为了解决目标函数无法进行进一步优化,XGBoost原文是使用泰勒级数展开式技术对目标函数进行近似转换,即使用函数的1阶、2阶、3阶...阶导数和对应的函数值,将目标函数进行多项式展开,多项式阶数越多,对目标函数的近似程度越高。这样做的好处是便于后面优化求解

令,,带入到目标函数公式4,得到基于二阶泰勒展开式的函数(如公式5所示),其中,。

在训练第颗树时,目标函数(公式5)中,,、是已知的。因此,可以将已知常数项去掉,得到进一步简化后的目标函数(公式6)。、分别表示第颗决策树的损失函数的1阶、2阶导数。前面颗决策树预测后,通过、将前面第颗决策树的预测损失信息传递给第颗决策树。在公式6中,第颗树的预测函数、树复杂度函数对于我们来说,仍然都是未知的,因此需要将其参数化,通过参数形式表示出来,才能进行下一步的优化求解。

3.如何将树结构引入到目标函数中?

接下来的问题是如何对函数、进行参数化表示。首先,对于叶子权重函数,如图4所示决策树,有1号、2号、3号叶子节点,这三个叶子节点对应的取值分别为15,12,20,在1号叶子节点上,有{1,3}两个样本,在2号叶子节点上,有{4}一个样本,在3号叶子节点上,有{2,5}两个样本。在这里,使用来表示决策树的叶子权重值,三个叶子节点对应的叶子权重值为、、。对于样本落在决策树叶子节点的位置信息,使用表示,表示样本1落在第1个叶子节点上,表示样本1落在第3个叶子节点上,表示样本4落在第2个叶子节点上。

图4.XGBoost决策树结构

对于第颗树的叶子权重函数,根据叶子权重值和样本所在叶子的位置信息,即可确定函数。因此,我们引入决策树叶子权重值和样本所在叶子的位置信息两个变量,将其参数化表示成。然而,是一个函数,作为的下标是不利于优化求解。因此,这里需要将转化为形式。是根据样本落在叶子节点的位置信息直接遍历计算损失函数。是从叶子节点的角度,对每个叶子节点中的样本进行遍历计算损失函数,其中,表示树的叶子节点。假设,即表示有哪些样本落在第j个叶子节点上,比如表示样本{1,3}落在叶子节点1上,表示样本{4}落在叶子节点2上,表示样本{2,5}落在叶子节点3上(如上文图4所示)。在这里强调一下,将转换为形式,是可以从数学公式推到得到(比如下式)。根据样本所在叶子节点位置,计算所有样本的一阶损失得到第一行等式,其中,表示样本的一阶损失,表示样本对应的叶子节点,表示叶子节点对应的叶子权重值。

对于模型复杂度,表示第颗树的复杂度。在决策树里面,如果要降低树的复杂度,在训练决策树时,可以通过叶子节点中样本个数、树的深度等控制决策树的复杂度。在XGBoost中,是通过叶子节点个数、树的深度、叶子节点值来控制模型复杂度。XGBoost中的决策树是分类与回归决策树CART(Classification and Regression Trees)。由于CART是二叉树,控制叶子节点个数等同于控制了树的深度。因此,可以使用叶子节点个数来评估树的复杂度,即叶子节点个数越多(树的深度越深),决策树结构越复杂。对于叶子节点值,由于叶子节点值越大,相当于样本预测值分布在较少的几颗决策树的叶子节点上,这样容易出现过拟合。如果叶子节点值越小,相当于预测值分布在较多的决策树叶子节点上,每颗决策树参与预测其中的一小部分,过拟合的风险被分散。因此,叶子节点值越大,模型越容易过拟合,等同于决策树的复杂度越高。综合起来,如公式7所示,使用叶子节点个数、叶子节点值评估第颗决策树的复杂度,其中、为超参数。如果希望叶子个数尽量少,则将值尽量调大,如果希望叶子权重值尽量小,则将尽量调大。

将和公式7带入目标函数(公式6)中,可以得到参数化的目标函数(公式8)。在公式8中,在训练第颗决策树时,和这两部分是已知,为超参数。令,,对公式8进行调整,此时得到目标函数是关于的一元二次抛物线,是目标函数最终的参数化表示形式。抛物线是有极值,对抛物线求极值可以直接套用抛物线极值公式,求解很方便。

基于公式8,对目标函数关于求导,可以求得树的叶子节点最优的权重值,如公式9所示。

将等式9带入到公式8中,计算得到树的目标损失值(如等式10),该等式表示决策树损失分数,分数越小,说明树的预测准确度越高、复杂度越低。

4.如何确定树的形状?

这里需要注意到一点,树的叶子节点最优解和损失函数极小值是在树的形状给定后的优化求解。因此,如果要求得叶子节点最优解和损失函数极小值,首先需要确定树的形状。如何寻找树的形状?最直接的方式是枚举所有可能的形状,然后计算每种形状的损失函数,从中选择损失函数最小的形状作为模型训练使用。这样在树的形状确定后,就可以对叶子节点值和损失函数值进行优化求解。这种方式在实际应用中一般不会采用,因为当样本的特征集很大时,树的形状个数是呈指数级增加,计算这些形状树对应损失函数需要消耗大量的计算资源。

为了寻找树的形状,我们一般使用贪心算法来简化计算,降低计算的复杂度。贪心算法是在局部寻找最优解,在每一步迭代时,选择能使当前局部最优的方向。XGBoost寻找树的形状的思路和传统决策树模型建立树的思路一致。比如传统决策树在进行节点分割时,基于信息熵,选择信息熵下降最大的特征进行分割;对于XGBoost树模型,基于损失函数,选择能让损失函数下降最多的特征进行分割。如图5所示,虚线框是已经构造好的树形状,如果需要在蓝色节点做进一步分裂,此时需要按照某种标准,选择最好的特征进行分割。在这里,XGBoost使用损失函数下降最大的特征作为节点分裂。

图5.XGBoost树节点最佳分割点

根据公式10,可以计算到蓝色节点在分裂前和分裂后的的损失函数值:。两式相减,则得到特征如果作为分裂节点时,所能带来的损失函数下降值大小。因此,依据如下等式,选择能使最大的特征作为分裂节点。

5.其它常见问题

关于XGBoost的常见经典问题,这类问题对于深入理解XGBoost模型很重要,因此,本文对此也进行了梳理小结。

(1) XGBoost为什么需要对目标函数进行泰勒展开?

根据XGBoost官网(如图6所示),目标损失函数之间存在较大的差别,比如平方损失函数、逻辑损失函数等。对目标函数进行泰勒展开,就是为了统一目标函数的形式,针对回归和分类问题,使得平方损失或逻辑损失函数优化求解,可以共用同一套算法框架及工程代码。另外,对目标函数进行泰勒展开,可以使得XGBoost支持自定义损失函数,只需要新的损失函数二阶可导即可,从而提升算法框架的扩展性

图6.XGBoost目标函数泰勒展开式官方解释

相对于GBDT的一阶泰勒展开,XGBoost采用二阶泰勒展开,可以更精准的逼近真实的损失函数,提升算法框架的精准性。另外,一阶导数描述梯度的变化方向,二阶导数可以描述梯度变化方向是如何变化的,利用二阶导数信息更容易找到极值点。因此,基于二阶导数信息能够让梯度收敛的更快,类似于牛顿法比SGD收敛更快。

(2) XGBoost如何进行采样?

XGBoost算法框架,参考随机森林的Bagging方法,支持样本采样和特征采样。由于XGBoost里没有交代是有放回采样,认为这里的样本采样和特征采样都是无放回采样。每次训练时,对数据集采样,可以增加树的多样性,降低模型过拟合的风险。另外,对数据集采样还能减少计算,加快模型的训练速度。在降低过拟合风险中,对特征采样比对样本采样的效果更显著。

样本采样(如图7所示),默认是不进行样本采样。样本的采样的方式有两种,一种是认为每个样本平等水平,对样本集进行相同概率采样;另外一种认为每个样本是不平等,每个样本对应的一阶、二阶导数信息表示优先级,导数信息越大的样本越有可能被采到。

图7.XGBoost样本采样

特征采样(如图8所示),默认对特征不进行采样。对特征的采样方式有三种,第一种是在建立每棵树时进行特征采样;第二种特征采样范围是在第一种的基础上,对于树的每一层级(树的深度)进行特征采样;第三种特征采样范围是在第二种的基础上,对于每个树节点进行特征采样。这三种特征采样方式有串行效果。比如,当第一、二、三种的特征采样比例均是0.5时,如果特征总量为64个,经过这三种采样的综合效果,最终采样得到的特征个数为8个。

图7.XGBoost样本采样


(3)XGBoost为什么训练会比较快?

XGBoost训练速度快,这个主要是工程实现优化的结果,具体的优化措施如下几点:第一、支持并行化训练。XGBoost的并行,并不是说每棵树可以并行训练,XGBoost本质上仍然采用Boosting思想,每棵树训练前需要等前面的树训练完成后才能开始训练。XGBoost的并行,指的是特征维度的并行。在训练之前,每个特征按特征值大小对样本进行预排序,并存储为Block结构(如图8所示),在后面查找特征分割点时可以重复使用,而且特征已经被存储为一个个Block结构,那么在寻找每个特征的最佳分割点时,可以利用多线程对每个Block并行计算。

图8.样本排序

第二、采用近似算法技术,得到候选分位点。在构造决策树分裂节点时,当采用精确贪心算法穷举计算每个特征下的所有特征值增益,如果特征个数多、特征取值大,会造成较大的计算量。当样本数据量大时,特征值无法完全加载到内存中,计算效率低。对于分布式数据集,同样会面临无法将特征值全部加载到本地内存的问题。因此,基于这两个现实问题,采用近似直方图算法,将每个特征取值划分为常数个分位点,作为候选分割点,从中选择相对最优的分割点作为决策树分裂节点。

第三、缓存感知访问技术。对于有大量数据或者说分布式系统来说,不可能将所有的数据都放进内存里面。因此,需要将其放在外存上或者将数据分布式存储。但是会有一个问题,这样做每次都要从外存上读取数据到内存,这将会是十分耗时的操作。在XGBoost中,采用预读取的方式,将下一块将要读取的数据预先放进内存里面。这个过程是多开了一个线程,该线程与训练的线程独立并负责数据读取。此外,还要考虑Block的大小问题。如果设置最大的Block来存储所有样本在特征上的值和梯度,Cache未必能一次性处理如此多的梯度做统计。如果设置过小的Block-size,这样不能充分利用多线程的优势。这样会出现训练线程已经训练完数据,但是预读取线程还没把数据放入内存或者cache中。经过测试,Block-size设置为2^16个特征值是效果最好。

第四、Blocks核外计算优化技术。为了高效使用系统资源,对于机器资源,除了CPU和内存外,磁盘空间也可以利用起来处理数据。为了实现这个功能,XGBoost在模型训练时,会将数据分成多个块并将每个块存储在磁盘上。在计算过程中,使用独立的线程将Block预提取到主内存缓冲区,这样数据计算和磁盘读取可以同步进行,但由于IO非常耗时,所以还采用了两种技术来改进这种核外计算。

  • Block Compression:块压缩,并且加载到主内存时由独立的线程进行解压缩。
  • Block Sharding:块分片,即将数据分片到多个磁盘,为每个磁盘分配一个线程,将数据提取到内存缓冲区,然后每次训练线程的时候交替地从每个缓冲区读取数据,有助于在多个磁盘可用时,增加读取的吞吐量。
  • 除了这些技术,XGBoost的特征采样技术也可以提升计算效率。如果设定特征采样比例colsample_by* < 1.0,则在选择最佳特征分割点作为分裂节点时,特征候选集变小,挑选最佳特征分割点时计算量降低。

    (4)XGBoost如何处理缺失值问题?

    XGBoost的一个优点是允许特征存在缺失值。对缺失值的处理方式如图9所示: 在特征上寻找最佳分割点时,不会对该列特征missing的样本进行遍历,而只对该特征值为non-missing的样本上对应的特征值进行遍历。对于稀疏离散特征,通过这个技巧可以大大减少寻找特征最佳分割点的时间开销。

    在逻辑实现上,为了保证完备性,会将该特征值missing的样本分别分配到左叶子节点和右叶子节点,两种情形都计算一遍后,选择分裂后增益最大的那个方向(左分支或是右分支),作为预测时特征值缺失样本的默认分支方向。 如果在训练中没有缺失值而在预测中出现缺失,那么会自动将缺失值的划分方向放到右子节点。

    图9.XGBoost缺失值处

    (5)XGBoost和GBDT的区别是什么?

    XGBoost和GBDT都是基于Boosting思想实现。XGBoost可以认为是在GBDT基础上的扩展。两者的主要不同如下:基分类器:GBDT是以分类与回归决策树CART作为基分类器,XGBoost的基分类器不仅支持CART决策树,还支持线性分类器,此时XGBoost相当于带L1和L2正则化项的Logistic回归(分类问题)或者线性回归(回归问题)。导数信息:GBDT在优化求解时,只是用到一阶导数信息,XGBoost对代价函数做了二阶泰勒展开,同时用到一阶和二阶导数信息。另外,XGBoost工具支持自定义代价函数,只要函数可以一阶和二阶求导即可。正则项:XGBoost在代价函数里加入正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的预测值的模的平方和。正则项有利于降低模型的方差variance,使学习出来的模型更加简单,防止过拟合。GBDT的代价函数中是没有正则项。缺失值处理:对于特征的取值有缺失的样本,XGBoost可以自动学习出它的分裂方向。 另外,XGBoost还做了其它工程优化,包括特征值Block化、并行化计算特征增益、近似直方图算法、特征采样技术

    (6)如何使用XGBoost进行模型训练?

    在使用XGBoost前,可以根据官网说明文档进行安装(下面有链接,这里不赘述)。本文采用的数据集是Kaggle平台房价预测开源数据集(地址如参考文章8所示)。值得说明的一点,在进行模型训练前,一般需要做数据清洗、特征工程、样本划分、模型参数调优这些过程。针对这些过程,本文在这里不展开细讲。在进行模型训练前,本文已经完成数据清洗、特征工程、模型参数调优过程,并得到最终用于模型训练的样本集和最优模型参数。如下代码,是使用XGBoost进行模型训练过程。

    #### 导入数据分析基础包 #####
    import pandas as pd 
    import matplotlib 
    import numpy as np 
    import scipy as sp 
    import IPython
    from IPython import display 
    import sklearn 
    import random
    import time
    
    #### 导入训练样本 #####
    # 样本集特征
    X_train=pd.read_csv('./final_train.csv',sep='\t',index=None)
    # 样本集标签
    y_train=pd.read_csv('./final_y_train.csv',sep='\t',index=None)
    
    ### 导入算法模型和评分标准 ####
    from sklearn import svm, tree, linear_model, neighbors, naive_bayes, ensemble, discriminant_analysis, gaussian_process
    from xgboost import XGBClassifier
    #Common Model Helpers
    from sklearn.preprocessing import OneHotEncoder, LabelEncoder
    from sklearn import feature_selection
    from sklearn import model_selection
    from sklearn import metrics
    #Visualization
    import matplotlib as mpl
    import matplotlib.pyplot as plt
    import matplotlib.pylab as pylab
    import seaborn as sns
    from pandas.plotting import scatter_matrix
    #Configure Visualization Defaults
    #%matplotlib inline = show plots in Jupyter Notebook browser
    %matplotlib inline
    mpl.style.use('ggplot')
    sns.set_style('white')
    pylab.rcParams['figure.figsize'] = 12,8
    
    from sklearn.tree import DecisionTreeRegressor
    from sklearn.linear_model import LinearRegression, ElasticNet
    from sklearn.ensemble import RandomForestRegressor
    from sklearn.metrics import fbeta_score, make_scorer, r2_score ,mean_squared_error
    from sklearn.linear_model import Lasso
    from sklearn.svm import SVR
    from xgboost import XGBRegressor
    from sklearn.model_selection import KFold, cross_val_score, train_test_split
    # 计算平方误差
    def rmsle(y, y_pred):
        return np.sqrt(mean_squared_error(y, y_pred))
    
    # 模型:Xgboost
    from sklearn.model_selection import GridSearchCV
    best_reg_xgb = XGBRegressor(learning_rate= 0.01, n_estimators = 5000,                  
                    max_depth= 4, min_child_weight = 1.5, gamma = 0, 
                    subsample = 0.7, colsample_bytree = 0.6, 
                    seed = 27)
    best_reg_xgb.fit(X_train, y_train)
    pred_y_XGB = best_reg_xgb.predict(X_train)
    
    # 
    print (rmsle(pred_y_XGB, y_train))
    
    

    6.小结

    本文从目标函数构建、目标函数优化、树结构信息表示、树形状确定等四部分,对XGBoost算法框架进行解析。最后,针对XGBoost的常见问题进行小结。通过本文,洞悉XGBoost框架的底层算法原理。在用户行为预判、用户标签预测、用户信用评分等数据分析业务中,经常会使用到XGBoost算法框架。如果对XGBoost算法原理理解透彻,在实际业务中的模型训练过程中,有利于较好地理解模型参数,对模型调参过程帮助较大。

    对于文章中表述不妥的地方,欢迎交流。

    参考文章

    (1).陈天奇XGBoost算法原著:https://dl.acm.org/doi/pdf/10.1145/2939672.2939785

    (2).20道XGBoost面试题:https://cloud.tencent.com/developer/article/1500914

    (3).XGBoost框架Parameters含义:https://xgboost.readthedocs.io/en/latest/parameter.html

    (4).XGBoost提升树官方介绍:https://xgboost.readthedocs.io/en/latest/tutorials/model.html

    (5).XGBoost官方论坛:https://discuss.xgboost.ai/

    (6).GBDT提升树官方介绍:https://scikit-learn.org/stable/modules/ensemble.html#gradient-tree-boosting

    (7).XGBoost安装官网说明:https://xgboost.readthedocs.io/en/latest/build.html

    (8).Kaggle开源数据:https://www.kaggle.com/c/house-prices-advanced-regression-techniques

    Apache C++ Standard Library : 是一系列算法,容器,迭代器和其他基本组件的集合

    ASL : Adobe源代码库提供了同行的评审和可移植的C++源代码库。

    Boost : 大量通用C++库的集合。

    BDE : 来自于彭博资讯实验室的开发环境。

    Cinder : 提供专业品质创造性编码的开源开发社区。

    Bxxomfort : 轻量级的,只包含头文件的库,将C++ 11的一些新特性移植到C++03中。

    Dlib : 使用契约式编程和现代C++科技设计的通用的跨平台的C++库。

    EASTL : EA-STL公共部分

    ffead-cpp : 企业应用程序开发框架

    Folly : 由Facebook开发和使用的开源C++库。

    JUCE : 包罗万象的C++类库,用于开发跨平台软件

    libphenom : 用于构建高性能和高度可扩展性系统的事件框架。

    LibSourcey : 用于实时的视频流和高性能网络应用程序的C++11 evented IO

    LibU : C语言写的多平台工具库

    Loki : C++库的设计,包括常见的设计模式和习语的实现。

    MiLi : 只含头文件的小型C++库

    openFrameworks : 开发C++工具包,用于创意性编码。

    Qt : 跨平台的应用程序和用户界面框架

    Reason : 跨平台的框架,使开发者能够更容易地使用Java,.Net和Python,同时也满足了他们对C++性能和优势的需求。

    ROOT : 具备所有功能的一系列面向对象的框架,能够非常高效地处理和分析大量的数据,为欧洲原子能研究机构所用。

    STLport : 是STL具有代表性的版本

    STXXL : 用于额外的大型数据集的标准模板库。

    Ultimate++ : C++跨平台快速应用程序开发框架

    Windows Template Library : 用于开发Windows应用程序和UI组件的C++库

    Yomm11 : C++11的开放multi-methods.

    异步事件循环

    Boost.Asio : 用于网络和底层I/O编程的跨平台的C++库。

    libev : 功能齐全,高性能的时间循环,轻微地仿效libevent,但是不再像libevent一样有局限性,也修复了它的一些bug。

    libevent : 事件通知库

    libuv : 跨平台异步I/O。

    libco : 协程,微信支持8亿用户同时在线的底层IO库。功能强大

    ntyco : 纯c版的协程框架,代码短小精悍,适合嵌入工程。

    libgo : golang风格的并发框架,C++11实现协程库

    网络库

    ACE : C++面向对象网络变成工具包

    Casablanca : C++ REST SDK

    cpp-netlib : 高级网络编程的开源库集合

    Dyad.c : C语言的异步网络

    libCurl : 多协议文件传输库

    Mongoose : 非常轻量级的网络服务器

    Muduo : 用于Linux多线程服务器的C++非阻塞网络库

    net_skeleton : C/C++的TCP 客户端/服务器库

    WAFer : 基于C语言的超轻型软件平台,用于可扩展的服务器端和网络应用。 对于C编程人员,可以考虑node.js

    Onion : C语言HTTP服务器库,其设计为轻量级,易使用。

    POCO : 用于构建网络和基于互联网应用程序的C++类库,可以运行在桌面,服务器,移动和嵌入式系统。

    RakNet : 为游戏开发人员提供的跨平台的开源C++网络引擎。

    Tufao : 用于Qt之上的C++构建的异步Web框架。

    WebSocket++ : 基于C++/Boost Aiso的websocket 客户端/服务器库

    ZeroMQ : 高速,模块化的异步通信库

    TCP/IP协议栈

    f-stack : 腾讯开源的协议栈,基于DPDK的高性能用户态协议栈。

    NtyTcp : 单线程的协议栈的,基于netmap,DPDK,rawSocket的实现。

    LWIP : 针对 RAM 平台的精简版的 TCP/IP 协议栈实现。

    mTCP : 针对多核系统的高可扩展性的用户空间 TCP/IP 协议栈。

    4.4BSD : * nix的协议栈是源于4.4BSD的。

    WEB应用框架

    Nginx : 一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。

    Lighttpd : 一款开源 Web 服务器软件,安全快速,符合行业标准,适配性强并且针对高配置环境进行了优化。

    Libmicrohttpd : GNU软件下的简单c库的Web服务器。API简单,快速。

    shttpd : 基于Mongoose的Web服务器框架。

    CivetWeb : 提供易于使用,强大的,C/C++嵌入式Web服务器,带有可选的CGI,SSL和Lua支持。

    CppCMS : 免费高性能的Web开发框架(不是 CMS).

    Crow : 一个C++微型web框架(灵感来自于Python Flask)

    Kore : 使用C语言开发的用于web应用程序的超快速和灵活的web服务器/框架。

    libOnion : 轻量级的库,帮助你使用C编程语言创建web服务器。

    QDjango : 使用C++编写的,基于Qt库的web框架,试图效仿Django API,因此得此名。

    Wt : 开发Web应用的C++库。

    标准库,算法与函数

    C++ Standard Library : 是一系列类和函数的集合,使用核心语言编写,也是C++ISO自身标准的一部分。

    Standard Template Library : 标准模板库, STL

    C POSIX library : POSIX系统的C标准库规范

    ISO C++ Standards Committee : C++标准委员会

    音频库

    FMOD : 易于使用的跨平台的音频引擎和音频内容的游戏创作工具。

    Maximilian : C++音频和音乐数字信号处理库

    OpenAL : 开源音频库—跨平台的音频API

    Opus : 一个完全开放的,免版税的,高度通用的音频编解码器

    Speex : 免费编解码器,为Opus所废弃

    Tonic : C++易用和高效的音频合成

    Vorbis : Ogg Vorbis是一种完全开放的,非专有的,免版税的通用压缩音频格式。

    生态学

    lisequence : 用于表示和分析群体遗传学数据的C++库。

    SeqAn : 专注于生物数据序列分析的算法和数据结构。

    Vcflib : 用于解析和处理VCF文件的C++库

    Wham : 直接把联想测试应用到BAM文件的基因结构变异。

    压缩

    bzip2 : 一个完全免费,免费专利和高质量的数据压缩

    doboz : 能够快速解压缩的压缩库

    PhysicsFS : 对各种归档提供抽象访问的库,主要用于视频游戏,设计灵感部分来自于Quake3的文件子系统。

    KArchive : 用于创建,读写和操作文件档案(例如zip和 tar)的库,它通过QIODevice的一系列子类,使用gzip格式,提供了透明的压缩和解压缩的数据。

    LZ4 : 非常快速的压缩算法

    LZHAM : 无损压缩数据库,压缩比率跟LZMA接近,但是解压缩速度却要快得多。

    LZMA : 7z格式默认和通用的压缩方法。

    LZMAT : 及其快速的实时无损数据压缩库

    miniz : 单一的C源文件,紧缩/膨胀压缩库,使用zlib兼容API,ZIP归档读写,PNG写方式。

    Minizip : Zlib最新bug修复,支持PKWARE磁盘跨越,AES加密和IO缓冲。

    Snappy : 快速压缩和解压缩

    ZLib : 非常紧凑的数据流压缩库

    ZZIPlib : 提供ZIP归档的读权限。

    并发性

    Boost.Compute : 用于OpenCL的C++GPU计算库

    Bolt : 针对GPU进行优化的C++模板库

    C++React : 用于C++11的反应性编程库

    Intel TBB : Intel线程构件块

    Libclsph : 基于OpenCL的GPU加速SPH流体仿真库

    OpenCL : 并行编程的异构系统的开放标准

    OpenMP : OpenMP API

    Thrust : 类似于C++标准模板库的并行算法库

    HPX : 用于任何规模的并行和分布式应用程序的通用C++运行时系统

    VexCL : 用于OpenCL/CUDA 的C++向量表达式模板库。

    密码学

    Bcrypt : 一个跨平台的文件加密工具,加密文件可以移植到所有可支持的操作系统和处理器中。

    BeeCrypt : 快速的加密图形库,功能强大,接口方便。

    Botan : C++加密库

    Crypto++ : 一个有关加密方案的免费的C++库

    GnuPG : OpenPGP标准的完整实现

    GnuTLS : 实现了SSL,TLS和DTLS协议的安全通信库

    Libgcrypt : 基于GnuPG的加密图形库。

    Libmcrypt : 线程安全,提供统一的API。

    LibreSSL : 免费的SSL/TLS协议,属于2014 OpenSSL的一个分支

    LibTomCrypt : 一个非常全面的,模块化的,可移植的加密工具

    libsodium : 基于NaCI的加密库,固执己见,容易使用

    Nettle : 底层的加密库

    OpenSSL : 一个强大的,商用的,功能齐全的,开放源代码的加密库。

    Tiny AES128 in C : 用C实现的一个小巧,可移植的实现了AES128ESB的加密算法

    数据库

    hiberlite : 用于Sqlite3的C++对象关系映射

    hiredis : 用于Redis数据库的很简单的C客户端库

    LevelDB : 快速键值存储库

    LMDB : 符合数据库四大基本元素的嵌入键值存储

    MySQL++ : 封装了MySql的C API的C++ 包装器

    RocksDB : 来自Facebook的嵌入键值的快速存储

    SQLite : 一个完全嵌入式的,功能齐全的关系数据库,只有几百KB,可以正确包含到你的项目中。

    Redis : 一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库.

    MongoDB : 一个基于分布式文件存储的数据库

    调试

    Boost.Test : Boost测试库

    Catch : 一个很时尚的,C++原生的框架,只包含头文件,用于单元测试,测试驱动开发和行为驱动开发。

    CppUnit : 由JUnit移植过来的C++测试框架

    CTest : CMake测试驱动程序

    GoogleTest : 谷歌C++测试框架

    ig-debugheap : 用于跟踪内存错误的多平台调试堆

    libtap : 用C语言编写测试

    MemTrack : 用于C++跟踪内存分配

    MicroProfile : 跨平台的网络试图分析器

    minUnit : 使用C写的迷你单元测试框架,只使用了两个宏

    Remotery : 用于web视图的单一C文件分析器

    UnitTest++ : 轻量级的C++单元测试框架

    容器

    C++ B-Tree : 基于B树数据结构,实现命令内存容器的模板库

    Hashmaps : C++中开放寻址哈希表算法的实现

    游戏引擎

    Cocos2d-x : 一个跨平台框架,用于构建2D游戏,互动图书,演示和其他图形应用程序。

    Grit : 社区项目,用于构建一个免费的游戏引擎,实现开放的世界3D游戏。

    lrrlicht : C++语言编写的开源高性能的实时#D引擎

    PolyCode : C++实现的用于创建游戏的开源框架(与Lua绑定)。

    图形库

    bgfx : 跨平台的渲染库

    Cairo : 支持多种输出设备的2D图形库

    Horde3D : 一个小型的3D渲染和动画引擎

    magnum : C++11和OpenGL 2D/3D 图形引擎

    Ogre 3D : 用C++编写的一个面向场景,实时,灵活的3D渲染引擎(并非游戏引擎)

    OpenSceneGraph : 具有高性能的开源3D图形工具包

    Panda3D : 用于3D渲染和游戏开发的框架,用Python和C++编写。

    Skia : 用于绘制文字,图形和图像的完整的2D图形库

    urho3d : 跨平台的渲染和游戏引擎。

    图像处理

    Boost.GIL : 通用图像库

    CImg : 用于图像处理的小型开源C++工具包

    FreeImage : 开源库,支持现在多媒体应用所需的通用图片格式和其他格式。

    GDCM : Grassroots DICOM 库

    ITK : 跨平台的开源图像分析系统

    Magick++ : ImageMagick程序的C++接口

    OpenCV : 开源计算机视觉类库

    tesseract-ocr : OCR引擎

    VIGRA : 用于图像分析通用C++计算机视觉库

    VTK : 用于3D计算机图形学,图像处理和可视化的开源免费软件系统。

    国际化

    gettext : GNU gettext

    IBM ICU : 提供Unicode 和全球化支持的C、C++ 和Java库

    libiconv : 用于不同字符编码之间的编码转换库

    Json库

    frozen : C/C++的Jason解析生成器

    Jansson : 进行编解码和处理Jason数据的C语言库

    jbson : C++14中构建和迭代BSON data,和Json 文档的库

    JeayeSON : 非常健全的C++ JSON库,只包含头文件

    JSON++ : C++ JSON 解析器

    json-parser : 用可移植的ANSI C编写的JSON解析器,占用内存非常少

    json11 : 一个迷你的C++11 JSON库

    jute : 非常简单的C++ JSON解析器

    ibjson : C语言中的JSON解析和打印库,很容易和任何模型集成

    libjson : 轻量级的JSON库

    PicoJSON : C++中JSON解析序列化,只包含头文件

    Qt-Json : 用于JSON数据和 QVariant层次间的相互解析的简单类

    QJson : 将JSON数据映射到QVariant对象的基于Qt的库

    RepidJSON : 用于C++的快速JSON 解析生成器,包含SAX和DOM两种风格的API

    YAJL : C语言中快速流JSON解析库

    日志

    Boost.Log : 设计非常模块化,并且具有扩展性

    easyloggingpp : C++日志库,只包含单一的头文件。

    Log4cpp : 一系列C++类库,灵活添加日志到文件,系统日志,IDSA和其他地方。

    templog : 轻量级C++库,可以添加日志到你的C++应用程序中

    机器学习,人工智能

    btsk : 游戏行为树启动器工具

    Evolving Objects : 基于模板的,ANSI C++演化计算库,能够帮助你非常快速地编写出自己的随机优化算法。

    Caffe : 快速的神经网络框架

    CCV : 以C语言为核心的现代计算机视觉库

    mlpack : 可扩展的C++机器学习库

    OpenCV : 开源计算机视觉库

    Recommender : 使用协同过滤进行产品推荐/建议的C语言库。

    SHOGUN : Shogun 机器学习工具

    sofia-ml : 用于机器学习的快速增量算法套件

    数学库

    Armadillo : 高质量的C++线性代数库,速度和易用性做到了很好的平衡。语法和MatlAB很相似

    blaze : 高性能的C++数学库,用于密集和稀疏算法。

    ceres-solver : 来自谷歌的C++库,用于建模和解决大型复杂非线性最小平方问题。

    CGal : 高效,可靠的集合算法集合

    CML : 用于游戏和图形的免费C++数学库

    Eigen : 高级C++模板头文件库,包括线性代数,矩阵,向量操作,数值解决和其他相关的算法。

    GMTL : 数学图形模板库是一组广泛实现基本图形的工具。

    GMP : 用于个高精度计算的C/C++库,处理有符号整数,有理数和浮点数。

    多媒体库

    GStreamer : 构建媒体处理组件图形的库

    LIVE555 Streaming Media : 使用开放标准协议(RTP/RTCP, RTSP, SIP) 的多媒体流库

    libVLC : libVLC (VLC SDK)媒体框架

    QtAV : 基于Qt和FFmpeg的多媒体播放框架,能够帮助你轻而易举地编写出一个播放器

    SDL : 简单直控媒体层

    SFML : 快速,简单的多媒体库

    物理学

    Box2D : 2D的游戏物理引擎。

    Bullet : 3D的游戏物理引擎。

    Chipmunk : 快速,轻量级的2D游戏物理库

    LiquidFun : 2D的游戏物理引擎

    ODE : 开放动力学引擎-开源,高性能库,模拟刚体动力学。

    ofxBox2D : Box2D开源框架包装器。

    Simbody : 高性能C++多体动力学/物理库,模拟关节生物力学和机械系统,像车辆,机器人和人体骨骼。

    机器人学

    MOOS-Ivp : 一组开源C++模块,提供机器人平台的自主权,尤其是自主的海洋车辆。

    MRPT : 移动机器人编程工具包

    PCL : 点云库是一个独立的,大规模的开放项目,用于2D/3D图像和点云处理。

    Robotics Library : 一个独立的C++库,包括机器人动力学,运动规划和控制。

    RobWork : 一组C++库的集合,用于机器人系统的仿真和控制。

    ROS : 机器人操作系统,提供了一些库和工具帮助软件开发人员创建机器人应用程序。

    科学计算

    FFTW : 用一维或者多维计算DFT的C语言库。

    GSL : GNU科学库。

    脚本

    ChaiScript : 用于C++的易于使用的嵌入式脚本语言。

    Lua : 用于配置文件和基本应用程序脚本的小型快速脚本引擎。

    luacxx : 用于创建Lua绑定的C++ 11 API

    SWIG : 一个可以让你的C++代码链接到JavaScript,Perl,PHP,Python,Tcl和Ruby的包装器/接口生成器

    V7 : 嵌入式的JavaScript 引擎。

    V8 : 谷歌的快速JavaScript引擎,可以被嵌入到任何C++应用程序中。

    序列化

    Cap'n Proto : 快速数据交换格式和RPC系统。

    cereal : C++11 序列化库

    FlatBuffers : 内存高效的序列化库

    MessagePack : C/C++的高效二进制序列化库,例如 JSON

    ProtoBuf : 协议缓冲,谷歌的数据交换格式。

    ProtoBuf-c : C语言的协议缓冲实现

    SimpleBinaryEncoding : 用于低延迟应用程序的对二进制格式的应用程序信息的编码和解码。

    Thrift : 高效的跨语言IPC/RPC,用于C++,Java,Python,PHP,C#和其它多种语言中,最初由Facebook开发。

    视频库

    libvpx : VP8/VP9编码解码SDK

    FFMpeg : 一个完整的,跨平台的解决方案,用于记录,转换视频和音频流。

    libde265 : 开放的h.265视频编解码器的实现。

    OpenH264 : 开源H.364 编解码器。

    Theora : 免费开源的视频压缩格式。

    XML库

    Expat : 用C语言编写的xml解析库

    LibXml2 : Gnome的xml C解析器和工具包

    LibXml++ : C++的xml解析器

    PugiXML : 用于C++的,支持XPath的轻量级,简单快速的XML解析器。

    RapidXML : 试图创建最快速的XML解析器,同时保持易用性,可移植性和合理的W3C兼容性。

    TinyXML : 简单小型的C++XML解析器,可以很容易地集成到其它项目中。

    TinyXML2 : 简单快速的C++CML解析器,可以很容易集成到其它项目中。

    TinyXML++ : TinyXML的一个全新的接口,使用了C++的许多许多优势,模板,异常和更好的异常处理。

    Xerces-C++ : 用可移植的C++的子集编写的XML验证解析器。

    专注于服务器后台开发,包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK技术分享,Linux后端开发配套视频资料,与一线互联网企业架构内部分享资料。(c/c++开发者的宝藏库)

    关注,私信【框架】统统带走,就想要个赞~