于BOOST話題,很多電源工程師工作中會(huì)遇到不同的問(wèn)題。其實(shí)找到問(wèn)題的根源,才能對(duì)癥下藥。下面給大家分享幾篇不錯(cuò)的文章,供大家學(xué)習(xí)~
本文主要講了三種基礎(chǔ)拓?fù)洌╞uck boost buck-boost)的電路基礎(chǔ),以及BUCK的電路,設(shè)計(jì)的案例,下面就隨小編來(lái)看看吧。
一 三種基礎(chǔ)拓?fù)洌╞uck boost buck-boost)的電路基礎(chǔ):
1 電感的電壓公式 = ,推出ΔI=V×ΔT/L
2 sw閉合時(shí),電感通電電壓VON,閉合時(shí)間tON sw關(guān)斷時(shí),電感電壓VOFF,關(guān)斷時(shí)間tOFF
3 功率變換器穩(wěn)定工作的條件:ΔION=ΔIOFF即,電感在導(dǎo)通和關(guān)斷時(shí),其電流變化相等。那么由1,2的公式可知,VON =L×ΔION/ΔtON ,VOFF =L×ΔIOFF/ΔtOFF ,則穩(wěn)定條件為伏秒定律: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,在整個(gè)周期內(nèi)電感平均電流=負(fù)載平均電流,所以有:IL=Io
6 二極管只在sw關(guān)斷時(shí)流過(guò)電流,所以ID=IL×(1-D)
7 則平均開(kāi)關(guān)電流Isw=IL×D
8 由基爾霍夫電壓定律知:
Sw導(dǎo)通時(shí):VIN =VON+VO+VSW → VON=VIN-VO- VSW≈VIN-VO假設(shè)VSW相比足夠小
VO=VIN-VON-VSW≈VIN-VON
Sw關(guān)斷時(shí):VOFF =VO+VD → VO=VOFF-VD≈VOFF 假設(shè)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 見(jiàn)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 在臨界導(dǎo)通模式下,IAC =IDC,此時(shí)r=2 見(jiàn)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+I(xiàn)AC=(1+r/2)×IDC=(1+r/2) ×IL=(1+r/2)×IO
最?lèi)毫虞斎腚妷旱拇_定:
VO、Io不變,VIN對(duì)IPK的影響:
D=VO/ VIN VIN增加↑→D↓→ΔI↑, IDC=IO,不變,所以 IPK↑。
三 設(shè)計(jì)案例
某型號(hào)的DC-DC集成電路輸入電壓范圍是4.7-16V,現(xiàn)在有個(gè)電路用它來(lái)把12V轉(zhuǎn)為3.3V,最大輸出電流是2A。如果開(kāi)關(guān)頻率是500KHZ,那么電感的推薦值是多大……
原文鏈接:https://www.dianyuan.com/article/45477.html
在非隔離電源方案中,Buck、Boost、Buck-Boost電路應(yīng)用非常廣泛,很多工程師都對(duì)這三種電路非常熟。下面我們一起看下四開(kāi)關(guān)Buck-Boost電路。
常規(guī)的Buck-Boost電路,Vo=-Vin*D/(1-D),輸出電壓的極性和輸入電壓相反。
簡(jiǎn)要的四開(kāi)關(guān)Buck-Boost電路,Vo=Vin*D/(1-D),輸出電壓的極性與輸入電壓相同。
四開(kāi)關(guān)buck-boost的拓?fù)浜芎?jiǎn)單,如下圖。
對(duì)于四開(kāi)關(guān)buck-boost,它本身有一種非常傳統(tǒng)簡(jiǎn)單的控制方式。
那就是Q1和Q3同時(shí)工作,Q2和Q4同時(shí)工作。并且兩組MOS交替導(dǎo)通,如上圖。
如果把Q2和Q4換成二極管,那么也是同樣能工作,只不過(guò)沒(méi)有同步整流而已。
對(duì)于這種控制方式,在CCM情況下我們可以得到公式:
Vin*D=Vout(1-D)也就是說(shuō),Vout=Vin*D/(1-D). 這個(gè)電壓轉(zhuǎn)換比和我們常見(jiàn)的buck-boost是一樣的。
只不過(guò)常見(jiàn)的buck-boost的輸出電壓是負(fù)壓,而四開(kāi)關(guān)輸出的是正壓。
但是這種控制方式的優(yōu)點(diǎn)是簡(jiǎn)單,沒(méi)有模態(tài)切換。但是缺點(diǎn)是,四個(gè)管子都在一直工作,損耗大,共模噪音也大。
基于傳統(tǒng)控制方式的缺點(diǎn)。多年前,一家知名的IC公司推出了一款控制IC,革新了這個(gè)拓?fù)涞目刂品绞健?/span>
但是,這種思路本身沒(méi)什么奇特之處。真正有技術(shù)含量的是,當(dāng)VIn=Vout的時(shí)候,采用怎么樣的控制方式?
從buck過(guò)渡到中間模態(tài),再過(guò)渡到boost的時(shí)候,如何做到無(wú)縫切換? 這幾個(gè)問(wèn)題,后來(lái)成為各家IC公司,大開(kāi)腦洞,爭(zhēng)奪知識(shí)產(chǎn)權(quán)的戰(zhàn)場(chǎng)。
接下來(lái),我來(lái)介紹某特公司的IC的控制邏輯。
先假設(shè)輸出為固定的12V,輸入假設(shè)為一個(gè)電池,充滿(mǎn)電電壓為16V,放電結(jié)束電壓為8V。
那么從輸入16V開(kāi)始,此時(shí)的工作狀態(tài)顯然是BUCK
那么四個(gè)管子的驅(qū)動(dòng)信號(hào)如下圖
那么當(dāng)輸入電池電壓逐漸開(kāi)始降低,M1的占空比也逐漸開(kāi)始增大,而M2的占空比開(kāi)始減小。
此時(shí)M2的占空比是個(gè)關(guān)鍵的參數(shù)。
因?yàn)镮C內(nèi)部對(duì)M2的脈寬有個(gè)最小設(shè)定,假如說(shuō)是200ns。
那么現(xiàn)在假設(shè)輸入電壓掉到12.5V,而M2的脈寬也收縮到了200ns。IC內(nèi)部的邏輯電路就認(rèn)為到了模態(tài)切換的時(shí)候了。
此時(shí)發(fā)生的變化是,M3和M4兩個(gè)管子不再是常關(guān)和常通的狀態(tài),而是開(kāi)始開(kāi)關(guān)了。
如果我們把上圖進(jìn)行分解,就會(huì)發(fā)現(xiàn)一個(gè)有趣的現(xiàn)象,就是在一個(gè)clock周期里面,前半周期是buck,后半周期是boost……
原文鏈接:https://www.dianyuan.com/article/43788.html
電源最常見(jiàn)的三種結(jié)構(gòu)布局是降壓(buck)、升壓(boost)和降壓–升壓(buck-boost),這三種布局都不是相互隔離的。
今天介紹的主角是boost升壓電路,the boost converter(或者叫step-up converter),是一種常見(jiàn)的開(kāi)關(guān)直流升壓電路,它可以使輸出電壓比輸入電壓高。
下面主要從基本原理、boost電路參數(shù)設(shè)計(jì)、如何給Boost電路加保護(hù)電路三個(gè)方面來(lái)描述。
Part1 Boost電路的基本原理分析
Boost電路是一種開(kāi)關(guān)直流升壓電路,它能夠使輸出電壓高于輸入電壓。在電子電路設(shè)計(jì)當(dāng)中算是一種較為常見(jiàn)的電路設(shè)計(jì)方式。
首先,你需要了解的基本知識(shí):
電容阻礙電壓變化,通高頻,阻低頻,通交流,阻直流;
電感阻礙電流變化,通低頻,阻高頻,通直流,阻交流;
假定那個(gè)開(kāi)關(guān)(三極管或者M(jìn)OS管)已經(jīng)斷開(kāi)了很長(zhǎng)時(shí)間,所有的元件都處于理想狀態(tài),電容電壓等于輸入電壓。
下面要分充電和放電兩個(gè)部分來(lái)說(shuō)明這個(gè)電路。
充電過(guò)程
在充電過(guò)程中,開(kāi)關(guān)閉合(三極管導(dǎo)通),等效電路如上圖,開(kāi)關(guān)(三極管)處用導(dǎo)線代替。這時(shí),輸入電壓流過(guò)電感。二極管防止電容對(duì)地放電。由于輸入是直流電,所以電感上的電流以一定的比率線性增加,這個(gè)比率跟電感大小有關(guān)。隨著電感電流增加,電感里儲(chǔ)存了一些能量。
放電過(guò)程
如上圖,這是當(dāng)開(kāi)關(guān)斷開(kāi)(三極管截止)時(shí)的等效電路。當(dāng)開(kāi)關(guān)斷開(kāi)(三極管截止)時(shí),由于電感的電流保持特性,流經(jīng)電感的電流不會(huì)馬上變?yōu)?,而是緩慢的由充電完畢時(shí)的值變?yōu)?。而原來(lái)的電路已斷開(kāi),于是電感只能通過(guò)新電路放電,即電感開(kāi)始給電容充電,電容兩端電壓升高,此時(shí)電壓已經(jīng)高于輸入電壓了。升壓完畢。
說(shuō)起來(lái)升壓過(guò)程就是一個(gè)電感的能量傳遞過(guò)程。充電時(shí),電感吸收能量,放電時(shí)電感放出能量。如果電容量足夠大,那么在輸出端就可以在放電過(guò)程中保持一個(gè)持續(xù)的電流。如果這個(gè)通斷的過(guò)程不斷重復(fù),就可以在電容兩端得到高于輸入電壓的電壓……
原文鏈接:https://www.dianyuan.com/article/41704.html
對(duì)Boost電路進(jìn)行相應(yīng)的仿真測(cè)試,是工程師在平時(shí)最常接觸的工作。通過(guò)空間狀態(tài)平均法進(jìn)行仿真測(cè)試和波形檢測(cè),能夠快速有效的完成Simulink數(shù)字建模和檢測(cè)工作。本文將會(huì)就這一方法展開(kāi)簡(jiǎn)要介紹與分析,幫助工程師更輕松的實(shí)現(xiàn)建模和仿真檢測(cè)。
首先我們以Boost電路結(jié)構(gòu)的變換器為例,來(lái)看一下如何使用空間狀態(tài)平均法進(jìn)行公式計(jì)算。在計(jì)算中,工程師可以依據(jù)其拓?fù)浣Y(jié)構(gòu),分別寫(xiě)出Boost電路變換器開(kāi)通和關(guān)斷狀態(tài)方程。因?yàn)槊恳粋€(gè)開(kāi)關(guān)周期都是非常短暫的,所以我們?cè)谝粋€(gè)開(kāi)關(guān)周期內(nèi)用空間狀態(tài)平均法來(lái)綜合兩個(gè)階段的方程,可得到一個(gè)有關(guān)輸出電壓和開(kāi)關(guān)頻率的非線性狀態(tài)方程。
當(dāng)開(kāi)關(guān)導(dǎo)通時(shí),Boost狀態(tài)方程式為:
當(dāng)開(kāi)關(guān)關(guān)斷時(shí),Boost狀態(tài)方程式為:
對(duì)上述兩個(gè)公式用時(shí)間平均可得:
在上述公式中,參數(shù)U0代表輸出電壓;Ts代表開(kāi)關(guān)周期;ton代表開(kāi)通時(shí)間;toff代表關(guān)斷時(shí)間;Uin代表輸入電壓;IL代表電感電流。在得出相應(yīng)的數(shù)值之后,工程師可以用Simulink技術(shù)進(jìn)行數(shù)學(xué)建模,建模結(jié)果如下圖所示。
圖為空間狀態(tài)平均法的Boost電路變換器仿真模型
該模型中各個(gè)參數(shù)的計(jì)算過(guò)程如下:
在完成公式計(jì)算并進(jìn)行建模后,工程師利用該方法所得到的Boost變換器正常運(yùn)轉(zhuǎn)的仿真波形如下圖所示:
圖為空間狀態(tài)平均法的Boost電路變換器仿真波形
以上就是本文關(guān)于使用空間狀態(tài)平均法進(jìn)行Boost電路仿真檢測(cè)的介紹,希望能夠幫助工程師更好的完成電路系統(tǒng)仿真檢測(cè)工作……
原文鏈接:https://www.dianyuan.com/article/31006.html
意猶未盡,查看更多精彩文章→→https://www.dianyuan.com/eestar/
更多精彩內(nèi)容→→
PWM不過(guò)如此,你還在為PWM發(fā)愁?
反激就是這么回事,你入門(mén)了嗎?
反激→就是這樣的過(guò)程,搞不懂的快來(lái)GET
想快速學(xué)EMC,以下六篇文章足矣,建議收藏
讀懂這八篇文章,想不懂PWM都難
者:symonxiong,騰訊 CDG 應(yīng)用研究員
XGBoost是一種經(jīng)典的集成式提升算法框架,具有訓(xùn)練效率高、預(yù)測(cè)效果好、可控參數(shù)多、使用方便等特性,是大數(shù)據(jù)分析領(lǐng)域的一柄利器。在實(shí)際業(yè)務(wù)中,XGBoost經(jīng)常被運(yùn)用于用戶(hù)行為預(yù)判、用戶(hù)標(biāo)簽預(yù)測(cè)、用戶(hù)信用評(píng)分等項(xiàng)目中。XGBoost算法框架涉及到比較多數(shù)學(xué)公式和優(yōu)化技巧,比較難懂,容易出現(xiàn)一知半解的情況。由于XGBoost在數(shù)據(jù)分析領(lǐng)域?qū)嵲谑翘?jīng)典、太常用,最近帶著敬畏之心,對(duì)陳天奇博士的Paper和XGBoost官網(wǎng)重新學(xué)習(xí)了一下,基于此,本文對(duì)XGBoost算法的來(lái)龍去脈進(jìn)行小結(jié)。
本文重點(diǎn)解析XGBoost算法框架的原理,希望通過(guò)本文能夠洞悉XGBoost核心算法的來(lái)龍去脈。對(duì)于XGBoost算法,最先想到的是Boosting算法。Boosting提升算法是一種有效且被廣泛使用的模型訓(xùn)練算法,XGBoost也是基于Boosting來(lái)實(shí)現(xiàn)。Boosting算法思想是對(duì)弱分類(lèi)器基礎(chǔ)上不斷改進(jìn)提升,并將這些分類(lèi)器集成在一起,形成一個(gè)強(qiáng)分類(lèi)器。簡(jiǎn)而言之,XGBoost算法可以說(shuō)是一種集成式提升算法,是將許多基礎(chǔ)模型集成在一起,形成一個(gè)很強(qiáng)的模型。這里的基礎(chǔ)模型可以是分類(lèi)與回歸決策樹(shù)CART(Classification and Regression Trees),也可以是線性模型。如果基礎(chǔ)模型是CART樹(shù)(如圖1所示),比如第1顆決策樹(shù)tree1預(yù)測(cè)左下角男孩的值為+2,對(duì)于第1顆決策樹(shù)遺留下來(lái)的剩余部分,使用第2顆決策樹(shù)預(yù)測(cè)值為+0.9,則對(duì)男孩的總預(yù)測(cè)值為2+0.9=2.9。
圖1.基于二叉樹(shù)的XGBoost模型
XGBoost算法框架可以分為四個(gè)階段來(lái)理解(如圖2所示)。第一個(gè)階段,如何構(gòu)造目標(biāo)函數(shù)? 在進(jìn)行優(yōu)化求解時(shí),首先需要構(gòu)造目標(biāo)函數(shù),有了目標(biāo)函數(shù)才能進(jìn)行優(yōu)化求解。這種思路和LR模型(Logistic Regression)是一致。在LR模型中,首先,對(duì)于回歸問(wèn)題構(gòu)造平方項(xiàng)損失,對(duì)于分類(lèi)問(wèn)題構(gòu)造最大似然損失作為目標(biāo)函數(shù),然后基于構(gòu)造好的目標(biāo)函數(shù),才會(huì)考慮采用梯度下降算法進(jìn)行優(yōu)化求解,比如隨機(jī)梯度下降、Mini-Batch批量梯度下降、梯度下降等。在這個(gè)階段,我們可以得到XGBoost的基本目標(biāo)函數(shù)結(jié)構(gòu)。
第二個(gè)階段,目標(biāo)函數(shù)優(yōu)化求解困難,如何對(duì)目標(biāo)函數(shù)近似轉(zhuǎn)換? 在第一個(gè)階段得到的基本目標(biāo)函數(shù)較為復(fù)雜,不是凸函數(shù),沒(méi)法使用連續(xù)性變量對(duì)目標(biāo)函數(shù)直接優(yōu)化求極值。因此,使用泰勒級(jí)數(shù)對(duì)目標(biāo)函數(shù)進(jìn)行展開(kāi),對(duì)目標(biāo)函數(shù)規(guī)整、重組后,將目標(biāo)函數(shù)轉(zhuǎn)換為關(guān)于預(yù)測(cè)殘差的多項(xiàng)式函數(shù)。
第三個(gè)階段,如何將樹(shù)的結(jié)構(gòu)引入到目標(biāo)函數(shù)中? 第二個(gè)階段得到的多項(xiàng)式目標(biāo)函數(shù)是一個(gè)復(fù)合函數(shù)。被預(yù)測(cè)的殘差和模型復(fù)雜度還是未知的函數(shù),需要對(duì)這兩個(gè)函數(shù)進(jìn)行參數(shù)化表示,即將決策樹(shù)的結(jié)構(gòu)信息通過(guò)數(shù)學(xué)符號(hào)表示出來(lái)。在第三個(gè)階段,在樹(shù)的形狀確定情況下,可以?xún)?yōu)化求解出局部最優(yōu)解。
第四個(gè)階段,如何確定樹(shù)的形狀,要不要使用貪心算法? 如何在模型空間里面尋找最優(yōu)的決策樹(shù)形狀,這是一個(gè)NP-Hard問(wèn)題,我們很難對(duì)可能存在的樹(shù)結(jié)構(gòu)全部羅列出來(lái),尤其在特征個(gè)數(shù)很多情況下。因此,在這里需要使用貪心算法來(lái)求得局部最優(yōu)解。
圖2.XGBoost算法構(gòu)建邏輯
當(dāng)使用多棵樹(shù)來(lái)預(yù)測(cè)時(shí),假設(shè)已經(jīng)訓(xùn)練了棵樹(shù),則對(duì)于第個(gè)樣本的(最終)預(yù)測(cè)值為:
在公式1中, 表示對(duì) 個(gè)樣本的預(yù)測(cè)值,屬于集合范圍內(nèi), 表示通過(guò)第棵樹(shù)對(duì)第個(gè)樣本進(jìn)行預(yù)測(cè),比如第1棵樹(shù)預(yù)測(cè)值為,第2棵樹(shù)預(yù)測(cè)值為 ,依次類(lèi)推,將這些樹(shù)的預(yù)測(cè)值累加到一起,則得到樣本的最終預(yù)測(cè)值。因此,如果要得到樣本的最終預(yù)測(cè)值,需要訓(xùn)練得到棵樹(shù)。
如果要訓(xùn)練得到棵樹(shù),首先需要構(gòu)造訓(xùn)練的目標(biāo)函數(shù)(如公式2所示)。在構(gòu)建模型時(shí),不僅需要考慮到模型的預(yù)測(cè)準(zhǔn)確性,還需要考慮到模型的復(fù)雜程度,既準(zhǔn)確又簡(jiǎn)單的模型在實(shí)際應(yīng)用中的效果才是最好的。因此,目標(biāo)函數(shù)由兩部分構(gòu)成,第一部分表示損失函數(shù),比如平方損失、交叉熵?fù)p失、折頁(yè)損失函數(shù)等。第一部分表示個(gè)樣本總的損失函數(shù)值。因?yàn)樵谶@里通過(guò)樣本預(yù)測(cè)值和樣本真實(shí)值的比較,可以計(jì)算出針對(duì)樣本的模型預(yù)測(cè)損失值。這里可以暫時(shí)先不用考慮損失函數(shù)的具體形式,因?yàn)檫@里的損失函數(shù),可以統(tǒng)一表示回歸與分類(lèi)問(wèn)題的損失函數(shù)形式。
公式2的第二部分表示正則項(xiàng),是用來(lái)控制模型的復(fù)雜度,模型越復(fù)雜,懲罰力度越大,從而提升模型的泛化能力,因?yàn)樵綇?fù)雜的模型越容易過(guò)擬合。XGBoost的正則化思路跟模型中加/正則化思路一致,不同的地方在于正則化項(xiàng)具體物理含義不同。在這里表示第棵樹(shù)的復(fù)雜度,接下來(lái)的問(wèn)題是如何對(duì)樹(shù)的復(fù)雜度進(jìn)行參數(shù)化表示,這樣后面才能進(jìn)行參數(shù)優(yōu)化。
在損失函數(shù)中,是有很多個(gè)模型(決策樹(shù))共同參與,通過(guò)疊加式的訓(xùn)練得到。如圖2所示,訓(xùn)練完第一顆樹(shù)后,對(duì)于第一棵樹(shù)沒(méi)有訓(xùn)練好的地方,使用第二顆樹(shù)訓(xùn)練,依次類(lèi)推,訓(xùn)練第個(gè)棵樹(shù),最后訓(xùn)練第顆樹(shù)。當(dāng)在訓(xùn)練第棵樹(shù)時(shí),前面的第1棵樹(shù)到第顆樹(shù)是已知的,未知的是第棵樹(shù),即基于前面構(gòu)建的決策樹(shù)已知情況下,構(gòu)建第棵樹(shù)。
圖3.XGBoost疊加式訓(xùn)練
對(duì)于樣本,首先初始化假定第0棵樹(shù)為,預(yù)測(cè)值為,然后在第0棵樹(shù)基礎(chǔ)上訓(xùn)練第1棵樹(shù),得到預(yù)測(cè)值,在第1棵樹(shù)基礎(chǔ)上訓(xùn)練第2顆樹(shù),又可以得到預(yù)測(cè)值,依次類(lèi)推,當(dāng)訓(xùn)練第棵樹(shù)的時(shí)候,前面棵樹(shù)的總預(yù)測(cè)值為,遞推訓(xùn)練具體過(guò)程如下所示:
根據(jù)XGBoost的遞推訓(xùn)練過(guò)程,每棵決策樹(shù)訓(xùn)練時(shí)會(huì)得到樣本對(duì)應(yīng)的預(yù)測(cè)值,根據(jù)樣本預(yù)測(cè)值和真實(shí)值比較,可以計(jì)算得到模型預(yù)測(cè)損失值。又因?yàn)橛?xùn)練所得的每棵決策樹(shù)都有對(duì)應(yīng)的結(jié)構(gòu)信息,因此可以得到每棵決策樹(shù)的復(fù)雜度。根據(jù)這些信息,可以對(duì)目標(biāo)函數(shù)公式2進(jìn)行簡(jiǎn)化,得到公式3。
在公式3中,表示訓(xùn)練樣本個(gè)數(shù),為顆決策樹(shù)累加的預(yù)測(cè)值,為顆決策樹(shù)總的復(fù)雜度,在訓(xùn)練第顆決策樹(shù)時(shí),這兩個(gè)東西是已知的,即在對(duì)目標(biāo)函數(shù)進(jìn)行求最小值優(yōu)化時(shí)候,和為已知。因此,將常數(shù)項(xiàng)拿掉,得到公式4作為XGBoost的目標(biāo)函數(shù)。
在公式4中,已經(jīng)得到了需要優(yōu)化的目標(biāo)函數(shù),這個(gè)目標(biāo)函數(shù)已經(jīng)是簡(jiǎn)化后的函數(shù)。對(duì)于公式4,沒(méi)法進(jìn)行進(jìn)一步優(yōu)化。為了解決目標(biāo)函數(shù)無(wú)法進(jìn)行進(jìn)一步優(yōu)化,XGBoost原文是使用泰勒級(jí)數(shù)展開(kāi)式技術(shù)對(duì)目標(biāo)函數(shù)進(jìn)行近似轉(zhuǎn)換,即使用函數(shù)的1階、2階、3階...階導(dǎo)數(shù)和對(duì)應(yīng)的函數(shù)值,將目標(biāo)函數(shù)進(jìn)行多項(xiàng)式展開(kāi),多項(xiàng)式階數(shù)越多,對(duì)目標(biāo)函數(shù)的近似程度越高。這樣做的好處是便于后面優(yōu)化求解。
令,,帶入到目標(biāo)函數(shù)公式4,得到基于二階泰勒展開(kāi)式的函數(shù)(如公式5所示),其中,。
在訓(xùn)練第顆樹(shù)時(shí),目標(biāo)函數(shù)(公式5)中,,、是已知的。因此,可以將已知常數(shù)項(xiàng)去掉,得到進(jìn)一步簡(jiǎn)化后的目標(biāo)函數(shù)(公式6)。、分別表示第顆決策樹(shù)的損失函數(shù)的1階、2階導(dǎo)數(shù)。前面顆決策樹(shù)預(yù)測(cè)后,通過(guò)、將前面第顆決策樹(shù)的預(yù)測(cè)損失信息傳遞給第顆決策樹(shù)。在公式6中,第顆樹(shù)的預(yù)測(cè)函數(shù)、樹(shù)復(fù)雜度函數(shù)對(duì)于我們來(lái)說(shuō),仍然都是未知的,因此需要將其參數(shù)化,通過(guò)參數(shù)形式表示出來(lái),才能進(jìn)行下一步的優(yōu)化求解。
接下來(lái)的問(wèn)題是如何對(duì)函數(shù)、進(jìn)行參數(shù)化表示。首先,對(duì)于葉子權(quán)重函數(shù),如圖4所示決策樹(shù),有1號(hào)、2號(hào)、3號(hào)葉子節(jié)點(diǎn),這三個(gè)葉子節(jié)點(diǎn)對(duì)應(yīng)的取值分別為15,12,20,在1號(hào)葉子節(jié)點(diǎn)上,有{1,3}兩個(gè)樣本,在2號(hào)葉子節(jié)點(diǎn)上,有{4}一個(gè)樣本,在3號(hào)葉子節(jié)點(diǎn)上,有{2,5}兩個(gè)樣本。在這里,使用來(lái)表示決策樹(shù)的葉子權(quán)重值,三個(gè)葉子節(jié)點(diǎn)對(duì)應(yīng)的葉子權(quán)重值為、、。對(duì)于樣本落在決策樹(shù)葉子節(jié)點(diǎn)的位置信息,使用表示,表示樣本1落在第1個(gè)葉子節(jié)點(diǎn)上,表示樣本1落在第3個(gè)葉子節(jié)點(diǎn)上,表示樣本4落在第2個(gè)葉子節(jié)點(diǎn)上。
圖4.XGBoost決策樹(shù)結(jié)構(gòu)
對(duì)于第顆樹(shù)的葉子權(quán)重函數(shù),根據(jù)葉子權(quán)重值和樣本所在葉子的位置信息,即可確定函數(shù)。因此,我們引入決策樹(shù)葉子權(quán)重值和樣本所在葉子的位置信息兩個(gè)變量,將其參數(shù)化表示成。然而,是一個(gè)函數(shù),作為的下標(biāo)是不利于優(yōu)化求解。因此,這里需要將轉(zhuǎn)化為形式。是根據(jù)樣本落在葉子節(jié)點(diǎn)的位置信息直接遍歷計(jì)算損失函數(shù)。是從葉子節(jié)點(diǎn)的角度,對(duì)每個(gè)葉子節(jié)點(diǎn)中的樣本進(jìn)行遍歷計(jì)算損失函數(shù),其中,表示樹(shù)的葉子節(jié)點(diǎn)。假設(shè),即表示有哪些樣本落在第j個(gè)葉子節(jié)點(diǎn)上,比如表示樣本{1,3}落在葉子節(jié)點(diǎn)1上,表示樣本{4}落在葉子節(jié)點(diǎn)2上,表示樣本{2,5}落在葉子節(jié)點(diǎn)3上(如上文圖4所示)。在這里強(qiáng)調(diào)一下,將轉(zhuǎn)換為形式,是可以從數(shù)學(xué)公式推到得到(比如下式)。根據(jù)樣本所在葉子節(jié)點(diǎn)位置,計(jì)算所有樣本的一階損失得到第一行等式,其中,表示樣本的一階損失,表示樣本對(duì)應(yīng)的葉子節(jié)點(diǎn),表示葉子節(jié)點(diǎn)對(duì)應(yīng)的葉子權(quán)重值。
對(duì)于模型復(fù)雜度,表示第顆樹(shù)的復(fù)雜度。在決策樹(shù)里面,如果要降低樹(shù)的復(fù)雜度,在訓(xùn)練決策樹(shù)時(shí),可以通過(guò)葉子節(jié)點(diǎn)中樣本個(gè)數(shù)、樹(shù)的深度等控制決策樹(shù)的復(fù)雜度。在XGBoost中,是通過(guò)葉子節(jié)點(diǎn)個(gè)數(shù)、樹(shù)的深度、葉子節(jié)點(diǎn)值來(lái)控制模型復(fù)雜度。XGBoost中的決策樹(shù)是分類(lèi)與回歸決策樹(shù)CART(Classification and Regression Trees)。由于CART是二叉樹(shù),控制葉子節(jié)點(diǎn)個(gè)數(shù)等同于控制了樹(shù)的深度。因此,可以使用葉子節(jié)點(diǎn)個(gè)數(shù)來(lái)評(píng)估樹(shù)的復(fù)雜度,即葉子節(jié)點(diǎn)個(gè)數(shù)越多(樹(shù)的深度越深),決策樹(shù)結(jié)構(gòu)越復(fù)雜。對(duì)于葉子節(jié)點(diǎn)值,由于葉子節(jié)點(diǎn)值越大,相當(dāng)于樣本預(yù)測(cè)值分布在較少的幾顆決策樹(shù)的葉子節(jié)點(diǎn)上,這樣容易出現(xiàn)過(guò)擬合。如果葉子節(jié)點(diǎn)值越小,相當(dāng)于預(yù)測(cè)值分布在較多的決策樹(shù)葉子節(jié)點(diǎn)上,每顆決策樹(shù)參與預(yù)測(cè)其中的一小部分,過(guò)擬合的風(fēng)險(xiǎn)被分散。因此,葉子節(jié)點(diǎn)值越大,模型越容易過(guò)擬合,等同于決策樹(shù)的復(fù)雜度越高。綜合起來(lái),如公式7所示,使用葉子節(jié)點(diǎn)個(gè)數(shù)、葉子節(jié)點(diǎn)值評(píng)估第顆決策樹(shù)的復(fù)雜度,其中、為超參數(shù)。如果希望葉子個(gè)數(shù)盡量少,則將值盡量調(diào)大,如果希望葉子權(quán)重值盡量小,則將盡量調(diào)大。
將和公式7帶入目標(biāo)函數(shù)(公式6)中,可以得到參數(shù)化的目標(biāo)函數(shù)(公式8)。在公式8中,在訓(xùn)練第顆決策樹(shù)時(shí),和這兩部分是已知,為超參數(shù)。令,,對(duì)公式8進(jìn)行調(diào)整,此時(shí)得到目標(biāo)函數(shù)是關(guān)于的一元二次拋物線,是目標(biāo)函數(shù)最終的參數(shù)化表示形式。拋物線是有極值,對(duì)拋物線求極值可以直接套用拋物線極值公式,求解很方便。
基于公式8,對(duì)目標(biāo)函數(shù)關(guān)于求導(dǎo),可以求得樹(shù)的葉子節(jié)點(diǎn)最優(yōu)的權(quán)重值,如公式9所示。
將等式9帶入到公式8中,計(jì)算得到樹(shù)的目標(biāo)損失值(如等式10),該等式表示決策樹(shù)損失分?jǐn)?shù),分?jǐn)?shù)越小,說(shuō)明樹(shù)的預(yù)測(cè)準(zhǔn)確度越高、復(fù)雜度越低。
這里需要注意到一點(diǎn),樹(shù)的葉子節(jié)點(diǎn)最優(yōu)解和損失函數(shù)極小值是在樹(shù)的形狀給定后的優(yōu)化求解。因此,如果要求得葉子節(jié)點(diǎn)最優(yōu)解和損失函數(shù)極小值,首先需要確定樹(shù)的形狀。如何尋找樹(shù)的形狀?最直接的方式是枚舉所有可能的形狀,然后計(jì)算每種形狀的損失函數(shù),從中選擇損失函數(shù)最小的形狀作為模型訓(xùn)練使用。這樣在樹(shù)的形狀確定后,就可以對(duì)葉子節(jié)點(diǎn)值和損失函數(shù)值進(jìn)行優(yōu)化求解。這種方式在實(shí)際應(yīng)用中一般不會(huì)采用,因?yàn)楫?dāng)樣本的特征集很大時(shí),樹(shù)的形狀個(gè)數(shù)是呈指數(shù)級(jí)增加,計(jì)算這些形狀樹(shù)對(duì)應(yīng)損失函數(shù)需要消耗大量的計(jì)算資源。
為了尋找樹(shù)的形狀,我們一般使用貪心算法來(lái)簡(jiǎn)化計(jì)算,降低計(jì)算的復(fù)雜度。貪心算法是在局部尋找最優(yōu)解,在每一步迭代時(shí),選擇能使當(dāng)前局部最優(yōu)的方向。XGBoost尋找樹(shù)的形狀的思路和傳統(tǒng)決策樹(shù)模型建立樹(shù)的思路一致。比如傳統(tǒng)決策樹(shù)在進(jìn)行節(jié)點(diǎn)分割時(shí),基于信息熵,選擇信息熵下降最大的特征進(jìn)行分割;對(duì)于XGBoost樹(shù)模型,基于損失函數(shù),選擇能讓損失函數(shù)下降最多的特征進(jìn)行分割。如圖5所示,虛線框是已經(jīng)構(gòu)造好的樹(shù)形狀,如果需要在藍(lán)色節(jié)點(diǎn)做進(jìn)一步分裂,此時(shí)需要按照某種標(biāo)準(zhǔn),選擇最好的特征進(jìn)行分割。在這里,XGBoost使用損失函數(shù)下降最大的特征作為節(jié)點(diǎn)分裂。
圖5.XGBoost樹(shù)節(jié)點(diǎn)最佳分割點(diǎn)
根據(jù)公式10,可以計(jì)算到藍(lán)色節(jié)點(diǎn)在分裂前和分裂后的的損失函數(shù)值:。兩式相減,則得到特征如果作為分裂節(jié)點(diǎn)時(shí),所能帶來(lái)的損失函數(shù)下降值大小。因此,依據(jù)如下等式,選擇能使最大的特征作為分裂節(jié)點(diǎn)。
關(guān)于XGBoost的常見(jiàn)經(jīng)典問(wèn)題,這類(lèi)問(wèn)題對(duì)于深入理解XGBoost模型很重要,因此,本文對(duì)此也進(jìn)行了梳理小結(jié)。
根據(jù)XGBoost官網(wǎng)(如圖6所示),目標(biāo)損失函數(shù)之間存在較大的差別,比如平方損失函數(shù)、邏輯損失函數(shù)等。對(duì)目標(biāo)函數(shù)進(jìn)行泰勒展開(kāi),就是為了統(tǒng)一目標(biāo)函數(shù)的形式,針對(duì)回歸和分類(lèi)問(wèn)題,使得平方損失或邏輯損失函數(shù)優(yōu)化求解,可以共用同一套算法框架及工程代碼。另外,對(duì)目標(biāo)函數(shù)進(jìn)行泰勒展開(kāi),可以使得XGBoost支持自定義損失函數(shù),只需要新的損失函數(shù)二階可導(dǎo)即可,從而提升算法框架的擴(kuò)展性。
圖6.XGBoost目標(biāo)函數(shù)泰勒展開(kāi)式官方解釋
相對(duì)于GBDT的一階泰勒展開(kāi),XGBoost采用二階泰勒展開(kāi),可以更精準(zhǔn)的逼近真實(shí)的損失函數(shù),提升算法框架的精準(zhǔn)性。另外,一階導(dǎo)數(shù)描述梯度的變化方向,二階導(dǎo)數(shù)可以描述梯度變化方向是如何變化的,利用二階導(dǎo)數(shù)信息更容易找到極值點(diǎn)。因此,基于二階導(dǎo)數(shù)信息能夠讓梯度收斂的更快,類(lèi)似于牛頓法比SGD收斂更快。
XGBoost算法框架,參考隨機(jī)森林的Bagging方法,支持樣本采樣和特征采樣。由于XGBoost里沒(méi)有交代是有放回采樣,認(rèn)為這里的樣本采樣和特征采樣都是無(wú)放回采樣。每次訓(xùn)練時(shí),對(duì)數(shù)據(jù)集采樣,可以增加樹(shù)的多樣性,降低模型過(guò)擬合的風(fēng)險(xiǎn)。另外,對(duì)數(shù)據(jù)集采樣還能減少計(jì)算,加快模型的訓(xùn)練速度。在降低過(guò)擬合風(fēng)險(xiǎn)中,對(duì)特征采樣比對(duì)樣本采樣的效果更顯著。
樣本采樣(如圖7所示),默認(rèn)是不進(jìn)行樣本采樣。樣本的采樣的方式有兩種,一種是認(rèn)為每個(gè)樣本平等水平,對(duì)樣本集進(jìn)行相同概率采樣;另外一種認(rèn)為每個(gè)樣本是不平等,每個(gè)樣本對(duì)應(yīng)的一階、二階導(dǎo)數(shù)信息表示優(yōu)先級(jí),導(dǎo)數(shù)信息越大的樣本越有可能被采到。
圖7.XGBoost樣本采樣
特征采樣(如圖8所示),默認(rèn)對(duì)特征不進(jìn)行采樣。對(duì)特征的采樣方式有三種,第一種是在建立每棵樹(shù)時(shí)進(jìn)行特征采樣;第二種特征采樣范圍是在第一種的基礎(chǔ)上,對(duì)于樹(shù)的每一層級(jí)(樹(shù)的深度)進(jìn)行特征采樣;第三種特征采樣范圍是在第二種的基礎(chǔ)上,對(duì)于每個(gè)樹(shù)節(jié)點(diǎn)進(jìn)行特征采樣。這三種特征采樣方式有串行效果。比如,當(dāng)?shù)谝弧⒍⑷N的特征采樣比例均是0.5時(shí),如果特征總量為64個(gè),經(jīng)過(guò)這三種采樣的綜合效果,最終采樣得到的特征個(gè)數(shù)為8個(gè)。
圖7.XGBoost樣本采樣
XGBoost訓(xùn)練速度快,這個(gè)主要是工程實(shí)現(xiàn)優(yōu)化的結(jié)果,具體的優(yōu)化措施如下幾點(diǎn):第一、支持并行化訓(xùn)練。XGBoost的并行,并不是說(shuō)每棵樹(shù)可以并行訓(xùn)練,XGBoost本質(zhì)上仍然采用Boosting思想,每棵樹(shù)訓(xùn)練前需要等前面的樹(shù)訓(xùn)練完成后才能開(kāi)始訓(xùn)練。XGBoost的并行,指的是特征維度的并行。在訓(xùn)練之前,每個(gè)特征按特征值大小對(duì)樣本進(jìn)行預(yù)排序,并存儲(chǔ)為Block結(jié)構(gòu)(如圖8所示),在后面查找特征分割點(diǎn)時(shí)可以重復(fù)使用,而且特征已經(jīng)被存儲(chǔ)為一個(gè)個(gè)Block結(jié)構(gòu),那么在尋找每個(gè)特征的最佳分割點(diǎn)時(shí),可以利用多線程對(duì)每個(gè)Block并行計(jì)算。
圖8.樣本排序
第二、采用近似算法技術(shù),得到候選分位點(diǎn)。在構(gòu)造決策樹(shù)分裂節(jié)點(diǎn)時(shí),當(dāng)采用精確貪心算法窮舉計(jì)算每個(gè)特征下的所有特征值增益,如果特征個(gè)數(shù)多、特征取值大,會(huì)造成較大的計(jì)算量。當(dāng)樣本數(shù)據(jù)量大時(shí),特征值無(wú)法完全加載到內(nèi)存中,計(jì)算效率低。對(duì)于分布式數(shù)據(jù)集,同樣會(huì)面臨無(wú)法將特征值全部加載到本地內(nèi)存的問(wèn)題。因此,基于這兩個(gè)現(xiàn)實(shí)問(wèn)題,采用近似直方圖算法,將每個(gè)特征取值劃分為常數(shù)個(gè)分位點(diǎn),作為候選分割點(diǎn),從中選擇相對(duì)最優(yōu)的分割點(diǎn)作為決策樹(shù)分裂節(jié)點(diǎn)。
第三、緩存感知訪問(wèn)技術(shù)。對(duì)于有大量數(shù)據(jù)或者說(shuō)分布式系統(tǒng)來(lái)說(shuō),不可能將所有的數(shù)據(jù)都放進(jìn)內(nèi)存里面。因此,需要將其放在外存上或者將數(shù)據(jù)分布式存儲(chǔ)。但是會(huì)有一個(gè)問(wèn)題,這樣做每次都要從外存上讀取數(shù)據(jù)到內(nèi)存,這將會(huì)是十分耗時(shí)的操作。在XGBoost中,采用預(yù)讀取的方式,將下一塊將要讀取的數(shù)據(jù)預(yù)先放進(jìn)內(nèi)存里面。這個(gè)過(guò)程是多開(kāi)了一個(gè)線程,該線程與訓(xùn)練的線程獨(dú)立并負(fù)責(zé)數(shù)據(jù)讀取。此外,還要考慮Block的大小問(wèn)題。如果設(shè)置最大的Block來(lái)存儲(chǔ)所有樣本在特征上的值和梯度,Cache未必能一次性處理如此多的梯度做統(tǒng)計(jì)。如果設(shè)置過(guò)小的Block-size,這樣不能充分利用多線程的優(yōu)勢(shì)。這樣會(huì)出現(xiàn)訓(xùn)練線程已經(jīng)訓(xùn)練完數(shù)據(jù),但是預(yù)讀取線程還沒(méi)把數(shù)據(jù)放入內(nèi)存或者cache中。經(jīng)過(guò)測(cè)試,Block-size設(shè)置為2^16個(gè)特征值是效果最好。
第四、Blocks核外計(jì)算優(yōu)化技術(shù)。為了高效使用系統(tǒng)資源,對(duì)于機(jī)器資源,除了CPU和內(nèi)存外,磁盤(pán)空間也可以利用起來(lái)處理數(shù)據(jù)。為了實(shí)現(xiàn)這個(gè)功能,XGBoost在模型訓(xùn)練時(shí),會(huì)將數(shù)據(jù)分成多個(gè)塊并將每個(gè)塊存儲(chǔ)在磁盤(pán)上。在計(jì)算過(guò)程中,使用獨(dú)立的線程將Block預(yù)提取到主內(nèi)存緩沖區(qū),這樣數(shù)據(jù)計(jì)算和磁盤(pán)讀取可以同步進(jìn)行,但由于IO非常耗時(shí),所以還采用了兩種技術(shù)來(lái)改進(jìn)這種核外計(jì)算。
除了這些技術(shù),XGBoost的特征采樣技術(shù)也可以提升計(jì)算效率。如果設(shè)定特征采樣比例colsample_by* < 1.0,則在選擇最佳特征分割點(diǎn)作為分裂節(jié)點(diǎn)時(shí),特征候選集變小,挑選最佳特征分割點(diǎn)時(shí)計(jì)算量降低。
XGBoost的一個(gè)優(yōu)點(diǎn)是允許特征存在缺失值。對(duì)缺失值的處理方式如圖9所示: 在特征上尋找最佳分割點(diǎn)時(shí),不會(huì)對(duì)該列特征missing的樣本進(jìn)行遍歷,而只對(duì)該特征值為non-missing的樣本上對(duì)應(yīng)的特征值進(jìn)行遍歷。對(duì)于稀疏離散特征,通過(guò)這個(gè)技巧可以大大減少尋找特征最佳分割點(diǎn)的時(shí)間開(kāi)銷(xiāo)。
在邏輯實(shí)現(xiàn)上,為了保證完備性,會(huì)將該特征值missing的樣本分別分配到左葉子節(jié)點(diǎn)和右葉子節(jié)點(diǎn),兩種情形都計(jì)算一遍后,選擇分裂后增益最大的那個(gè)方向(左分支或是右分支),作為預(yù)測(cè)時(shí)特征值缺失樣本的默認(rèn)分支方向。 如果在訓(xùn)練中沒(méi)有缺失值而在預(yù)測(cè)中出現(xiàn)缺失,那么會(huì)自動(dòng)將缺失值的劃分方向放到右子節(jié)點(diǎn)。
圖9.XGBoost缺失值處
XGBoost和GBDT都是基于Boosting思想實(shí)現(xiàn)。XGBoost可以認(rèn)為是在GBDT基礎(chǔ)上的擴(kuò)展。兩者的主要不同如下:基分類(lèi)器:GBDT是以分類(lèi)與回歸決策樹(shù)CART作為基分類(lèi)器,XGBoost的基分類(lèi)器不僅支持CART決策樹(shù),還支持線性分類(lèi)器,此時(shí)XGBoost相當(dāng)于帶L1和L2正則化項(xiàng)的Logistic回歸(分類(lèi)問(wèn)題)或者線性回歸(回歸問(wèn)題)。導(dǎo)數(shù)信息:GBDT在優(yōu)化求解時(shí),只是用到一階導(dǎo)數(shù)信息,XGBoost對(duì)代價(jià)函數(shù)做了二階泰勒展開(kāi),同時(shí)用到一階和二階導(dǎo)數(shù)信息。另外,XGBoost工具支持自定義代價(jià)函數(shù),只要函數(shù)可以一階和二階求導(dǎo)即可。正則項(xiàng):XGBoost在代價(jià)函數(shù)里加入正則項(xiàng),用于控制模型的復(fù)雜度。正則項(xiàng)里包含了樹(shù)的葉子節(jié)點(diǎn)個(gè)數(shù)、每個(gè)葉子節(jié)點(diǎn)上輸出的預(yù)測(cè)值的模的平方和。正則項(xiàng)有利于降低模型的方差variance,使學(xué)習(xí)出來(lái)的模型更加簡(jiǎn)單,防止過(guò)擬合。GBDT的代價(jià)函數(shù)中是沒(méi)有正則項(xiàng)。缺失值處理:對(duì)于特征的取值有缺失的樣本,XGBoost可以自動(dòng)學(xué)習(xí)出它的分裂方向。 另外,XGBoost還做了其它工程優(yōu)化,包括特征值Block化、并行化計(jì)算特征增益、近似直方圖算法、特征采樣技術(shù)等
在使用XGBoost前,可以根據(jù)官網(wǎng)說(shuō)明文檔進(jìn)行安裝(下面有鏈接,這里不贅述)。本文采用的數(shù)據(jù)集是Kaggle平臺(tái)房?jī)r(jià)預(yù)測(cè)開(kāi)源數(shù)據(jù)集(地址如參考文章8所示)。值得說(shuō)明的一點(diǎn),在進(jìn)行模型訓(xùn)練前,一般需要做數(shù)據(jù)清洗、特征工程、樣本劃分、模型參數(shù)調(diào)優(yōu)這些過(guò)程。針對(duì)這些過(guò)程,本文在這里不展開(kāi)細(xì)講。在進(jìn)行模型訓(xùn)練前,本文已經(jīng)完成數(shù)據(jù)清洗、特征工程、模型參數(shù)調(diào)優(yōu)過(guò)程,并得到最終用于模型訓(xùn)練的樣本集和最優(yōu)模型參數(shù)。如下代碼,是使用XGBoost進(jìn)行模型訓(xùn)練過(guò)程。
#### 導(dǎo)入數(shù)據(jù)分析基礎(chǔ)包 #####
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
#### 導(dǎo)入訓(xùn)練樣本 #####
# 樣本集特征
X_train=pd.read_csv('./final_train.csv',sep='\t',index=None)
# 樣本集標(biāo)簽
y_train=pd.read_csv('./final_y_train.csv',sep='\t',index=None)
### 導(dǎo)入算法模型和評(píng)分標(biāo)準(zhǔn) ####
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
# 計(jì)算平方誤差
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))
本文從目標(biāo)函數(shù)構(gòu)建、目標(biāo)函數(shù)優(yōu)化、樹(shù)結(jié)構(gòu)信息表示、樹(shù)形狀確定等四部分,對(duì)XGBoost算法框架進(jìn)行解析。最后,針對(duì)XGBoost的常見(jiàn)問(wèn)題進(jìn)行小結(jié)。通過(guò)本文,洞悉XGBoost框架的底層算法原理。在用戶(hù)行為預(yù)判、用戶(hù)標(biāo)簽預(yù)測(cè)、用戶(hù)信用評(píng)分等數(shù)據(jù)分析業(yè)務(wù)中,經(jīng)常會(huì)使用到XGBoost算法框架。如果對(duì)XGBoost算法原理理解透徹,在實(shí)際業(yè)務(wù)中的模型訓(xùn)練過(guò)程中,有利于較好地理解模型參數(shù),對(duì)模型調(diào)參過(guò)程幫助較大。
對(duì)于文章中表述不妥的地方,歡迎交流。
(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提升樹(shù)官方介紹:https://xgboost.readthedocs.io/en/latest/tutorials/model.html
(5).XGBoost官方論壇:https://discuss.xgboost.ai/
(6).GBDT提升樹(shù)官方介紹:https://scikit-learn.org/stable/modules/ensemble.html#gradient-tree-boosting
(7).XGBoost安裝官網(wǎng)說(shuō)明:https://xgboost.readthedocs.io/en/latest/build.html
(8).Kaggle開(kāi)源數(shù)據(jù):https://www.kaggle.com/c/house-prices-advanced-regression-techniques
架
Apache C++ Standard Library : 是一系列算法,容器,迭代器和其他基本組件的集合
ASL : Adobe源代碼庫(kù)提供了同行的評(píng)審和可移植的C++源代碼庫(kù)。
Boost : 大量通用C++庫(kù)的集合。
BDE : 來(lái)自于彭博資訊實(shí)驗(yàn)室的開(kāi)發(fā)環(huán)境。
Cinder : 提供專(zhuān)業(yè)品質(zhì)創(chuàng)造性編碼的開(kāi)源開(kāi)發(fā)社區(qū)。
Bxxomfort : 輕量級(jí)的,只包含頭文件的庫(kù),將C++ 11的一些新特性移植到C++03中。
Dlib : 使用契約式編程和現(xiàn)代C++科技設(shè)計(jì)的通用的跨平臺(tái)的C++庫(kù)。
EASTL : EA-STL公共部分
ffead-cpp : 企業(yè)應(yīng)用程序開(kāi)發(fā)框架
Folly : 由Facebook開(kāi)發(fā)和使用的開(kāi)源C++庫(kù)。
JUCE : 包羅萬(wàn)象的C++類(lèi)庫(kù),用于開(kāi)發(fā)跨平臺(tái)軟件
libphenom : 用于構(gòu)建高性能和高度可擴(kuò)展性系統(tǒng)的事件框架。
LibSourcey : 用于實(shí)時(shí)的視頻流和高性能網(wǎng)絡(luò)應(yīng)用程序的C++11 evented IO
LibU : C語(yǔ)言寫(xiě)的多平臺(tái)工具庫(kù)
Loki : C++庫(kù)的設(shè)計(jì),包括常見(jiàn)的設(shè)計(jì)模式和習(xí)語(yǔ)的實(shí)現(xiàn)。
MiLi : 只含頭文件的小型C++庫(kù)
openFrameworks : 開(kāi)發(fā)C++工具包,用于創(chuàng)意性編碼。
Qt : 跨平臺(tái)的應(yīng)用程序和用戶(hù)界面框架
Reason : 跨平臺(tái)的框架,使開(kāi)發(fā)者能夠更容易地使用Java,.Net和Python,同時(shí)也滿(mǎn)足了他們對(duì)C++性能和優(yōu)勢(shì)的需求。
ROOT : 具備所有功能的一系列面向?qū)ο蟮目蚣埽軌蚍浅8咝У靥幚砗头治龃罅康臄?shù)據(jù),為歐洲原子能研究機(jī)構(gòu)所用。
STLport : 是STL具有代表性的版本
STXXL : 用于額外的大型數(shù)據(jù)集的標(biāo)準(zhǔn)模板庫(kù)。
Ultimate++ : C++跨平臺(tái)快速應(yīng)用程序開(kāi)發(fā)框架
Windows Template Library : 用于開(kāi)發(fā)Windows應(yīng)用程序和UI組件的C++庫(kù)
Yomm11 : C++11的開(kāi)放multi-methods.
異步事件循環(huán)
Boost.Asio : 用于網(wǎng)絡(luò)和底層I/O編程的跨平臺(tái)的C++庫(kù)。
libev : 功能齊全,高性能的時(shí)間循環(huán),輕微地仿效libevent,但是不再像libevent一樣有局限性,也修復(fù)了它的一些bug。
libevent : 事件通知庫(kù)
libuv : 跨平臺(tái)異步I/O。
libco : 協(xié)程,微信支持8億用戶(hù)同時(shí)在線的底層IO庫(kù)。功能強(qiáng)大
ntyco : 純c版的協(xié)程框架,代碼短小精悍,適合嵌入工程。
libgo : golang風(fēng)格的并發(fā)框架,C++11實(shí)現(xiàn)協(xié)程庫(kù)
網(wǎng)絡(luò)庫(kù)
ACE : C++面向?qū)ο缶W(wǎng)絡(luò)變成工具包
Casablanca : C++ REST SDK
cpp-netlib : 高級(jí)網(wǎng)絡(luò)編程的開(kāi)源庫(kù)集合
Dyad.c : C語(yǔ)言的異步網(wǎng)絡(luò)
libCurl : 多協(xié)議文件傳輸庫(kù)
Mongoose : 非常輕量級(jí)的網(wǎng)絡(luò)服務(wù)器
Muduo : 用于Linux多線程服務(wù)器的C++非阻塞網(wǎng)絡(luò)庫(kù)
net_skeleton : C/C++的TCP 客戶(hù)端/服務(wù)器庫(kù)
WAFer : 基于C語(yǔ)言的超輕型軟件平臺(tái),用于可擴(kuò)展的服務(wù)器端和網(wǎng)絡(luò)應(yīng)用。 對(duì)于C編程人員,可以考慮node.js
Onion : C語(yǔ)言HTTP服務(wù)器庫(kù),其設(shè)計(jì)為輕量級(jí),易使用。
POCO : 用于構(gòu)建網(wǎng)絡(luò)和基于互聯(lián)網(wǎng)應(yīng)用程序的C++類(lèi)庫(kù),可以運(yùn)行在桌面,服務(wù)器,移動(dòng)和嵌入式系統(tǒng)。
RakNet : 為游戲開(kāi)發(fā)人員提供的跨平臺(tái)的開(kāi)源C++網(wǎng)絡(luò)引擎。
Tufao : 用于Qt之上的C++構(gòu)建的異步Web框架。
WebSocket++ : 基于C++/Boost Aiso的websocket 客戶(hù)端/服務(wù)器庫(kù)
ZeroMQ : 高速,模塊化的異步通信庫(kù)
TCP/IP協(xié)議棧
f-stack : 騰訊開(kāi)源的協(xié)議棧,基于DPDK的高性能用戶(hù)態(tài)協(xié)議棧。
NtyTcp : 單線程的協(xié)議棧的,基于netmap,DPDK,rawSocket的實(shí)現(xiàn)。
LWIP : 針對(duì) RAM 平臺(tái)的精簡(jiǎn)版的 TCP/IP 協(xié)議棧實(shí)現(xiàn)。
mTCP : 針對(duì)多核系統(tǒng)的高可擴(kuò)展性的用戶(hù)空間 TCP/IP 協(xié)議棧。
4.4BSD : * nix的協(xié)議棧是源于4.4BSD的。
WEB應(yīng)用框架
Nginx : 一個(gè)高性能的HTTP和反向代理web服務(wù)器,同時(shí)也提供了IMAP/POP3/SMTP服務(wù)。
Lighttpd : 一款開(kāi)源 Web 服務(wù)器軟件,安全快速,符合行業(yè)標(biāo)準(zhǔn),適配性強(qiáng)并且針對(duì)高配置環(huán)境進(jìn)行了優(yōu)化。
Libmicrohttpd : GNU軟件下的簡(jiǎn)單c庫(kù)的Web服務(wù)器。API簡(jiǎn)單,快速。
shttpd : 基于Mongoose的Web服務(wù)器框架。
CivetWeb : 提供易于使用,強(qiáng)大的,C/C++嵌入式Web服務(wù)器,帶有可選的CGI,SSL和Lua支持。
CppCMS : 免費(fèi)高性能的Web開(kāi)發(fā)框架(不是 CMS).
Crow : 一個(gè)C++微型web框架(靈感來(lái)自于Python Flask)
Kore : 使用C語(yǔ)言開(kāi)發(fā)的用于web應(yīng)用程序的超快速和靈活的web服務(wù)器/框架。
libOnion : 輕量級(jí)的庫(kù),幫助你使用C編程語(yǔ)言創(chuàng)建web服務(wù)器。
QDjango : 使用C++編寫(xiě)的,基于Qt庫(kù)的web框架,試圖效仿Django API,因此得此名。
Wt : 開(kāi)發(fā)Web應(yīng)用的C++庫(kù)。
標(biāo)準(zhǔn)庫(kù),算法與函數(shù)
C++ Standard Library : 是一系列類(lèi)和函數(shù)的集合,使用核心語(yǔ)言編寫(xiě),也是C++ISO自身標(biāo)準(zhǔn)的一部分。
Standard Template Library : 標(biāo)準(zhǔn)模板庫(kù), STL
C POSIX library : POSIX系統(tǒng)的C標(biāo)準(zhǔn)庫(kù)規(guī)范
ISO C++ Standards Committee : C++標(biāo)準(zhǔn)委員會(huì)
音頻庫(kù)
FMOD : 易于使用的跨平臺(tái)的音頻引擎和音頻內(nèi)容的游戲創(chuàng)作工具。
Maximilian : C++音頻和音樂(lè)數(shù)字信號(hào)處理庫(kù)
OpenAL : 開(kāi)源音頻庫(kù)—跨平臺(tái)的音頻API
Opus : 一個(gè)完全開(kāi)放的,免版稅的,高度通用的音頻編解碼器
Speex : 免費(fèi)編解碼器,為Opus所廢棄
Tonic : C++易用和高效的音頻合成
Vorbis : Ogg Vorbis是一種完全開(kāi)放的,非專(zhuān)有的,免版稅的通用壓縮音頻格式。
生態(tài)學(xué)
lisequence : 用于表示和分析群體遺傳學(xué)數(shù)據(jù)的C++庫(kù)。
SeqAn : 專(zhuān)注于生物數(shù)據(jù)序列分析的算法和數(shù)據(jù)結(jié)構(gòu)。
Vcflib : 用于解析和處理VCF文件的C++庫(kù)
Wham : 直接把聯(lián)想測(cè)試應(yīng)用到BAM文件的基因結(jié)構(gòu)變異。
壓縮
bzip2 : 一個(gè)完全免費(fèi),免費(fèi)專(zhuān)利和高質(zhì)量的數(shù)據(jù)壓縮
doboz : 能夠快速解壓縮的壓縮庫(kù)
PhysicsFS : 對(duì)各種歸檔提供抽象訪問(wèn)的庫(kù),主要用于視頻游戲,設(shè)計(jì)靈感部分來(lái)自于Quake3的文件子系統(tǒng)。
KArchive : 用于創(chuàng)建,讀寫(xiě)和操作文件檔案(例如zip和 tar)的庫(kù),它通過(guò)QIODevice的一系列子類(lèi),使用gzip格式,提供了透明的壓縮和解壓縮的數(shù)據(jù)。
LZ4 : 非常快速的壓縮算法
LZHAM : 無(wú)損壓縮數(shù)據(jù)庫(kù),壓縮比率跟LZMA接近,但是解壓縮速度卻要快得多。
LZMA : 7z格式默認(rèn)和通用的壓縮方法。
LZMAT : 及其快速的實(shí)時(shí)無(wú)損數(shù)據(jù)壓縮庫(kù)
miniz : 單一的C源文件,緊縮/膨脹壓縮庫(kù),使用zlib兼容API,ZIP歸檔讀寫(xiě),PNG寫(xiě)方式。
Minizip : Zlib最新bug修復(fù),支持PKWARE磁盤(pán)跨越,AES加密和IO緩沖。
Snappy : 快速壓縮和解壓縮
ZLib : 非常緊湊的數(shù)據(jù)流壓縮庫(kù)
ZZIPlib : 提供ZIP歸檔的讀權(quán)限。
并發(fā)性
Boost.Compute : 用于OpenCL的C++GPU計(jì)算庫(kù)
Bolt : 針對(duì)GPU進(jìn)行優(yōu)化的C++模板庫(kù)
C++React : 用于C++11的反應(yīng)性編程庫(kù)
Intel TBB : Intel線程構(gòu)件塊
Libclsph : 基于OpenCL的GPU加速SPH流體仿真庫(kù)
OpenCL : 并行編程的異構(gòu)系統(tǒng)的開(kāi)放標(biāo)準(zhǔn)
OpenMP : OpenMP API
Thrust : 類(lèi)似于C++標(biāo)準(zhǔn)模板庫(kù)的并行算法庫(kù)
HPX : 用于任何規(guī)模的并行和分布式應(yīng)用程序的通用C++運(yùn)行時(shí)系統(tǒng)
VexCL : 用于OpenCL/CUDA 的C++向量表達(dá)式模板庫(kù)。
密碼學(xué)
Bcrypt : 一個(gè)跨平臺(tái)的文件加密工具,加密文件可以移植到所有可支持的操作系統(tǒng)和處理器中。
BeeCrypt : 快速的加密圖形庫(kù),功能強(qiáng)大,接口方便。
Botan : C++加密庫(kù)
Crypto++ : 一個(gè)有關(guān)加密方案的免費(fèi)的C++庫(kù)
GnuPG : OpenPGP標(biāo)準(zhǔn)的完整實(shí)現(xiàn)
GnuTLS : 實(shí)現(xiàn)了SSL,TLS和DTLS協(xié)議的安全通信庫(kù)
Libgcrypt : 基于GnuPG的加密圖形庫(kù)。
Libmcrypt : 線程安全,提供統(tǒng)一的API。
LibreSSL : 免費(fèi)的SSL/TLS協(xié)議,屬于2014 OpenSSL的一個(gè)分支
LibTomCrypt : 一個(gè)非常全面的,模塊化的,可移植的加密工具
libsodium : 基于NaCI的加密庫(kù),固執(zhí)己見(jiàn),容易使用
Nettle : 底層的加密庫(kù)
OpenSSL : 一個(gè)強(qiáng)大的,商用的,功能齊全的,開(kāi)放源代碼的加密庫(kù)。
Tiny AES128 in C : 用C實(shí)現(xiàn)的一個(gè)小巧,可移植的實(shí)現(xiàn)了AES128ESB的加密算法
數(shù)據(jù)庫(kù)
hiberlite : 用于Sqlite3的C++對(duì)象關(guān)系映射
hiredis : 用于Redis數(shù)據(jù)庫(kù)的很簡(jiǎn)單的C客戶(hù)端庫(kù)
LevelDB : 快速鍵值存儲(chǔ)庫(kù)
LMDB : 符合數(shù)據(jù)庫(kù)四大基本元素的嵌入鍵值存儲(chǔ)
MySQL++ : 封裝了MySql的C API的C++ 包裝器
RocksDB : 來(lái)自Facebook的嵌入鍵值的快速存儲(chǔ)
SQLite : 一個(gè)完全嵌入式的,功能齊全的關(guān)系數(shù)據(jù)庫(kù),只有幾百KB,可以正確包含到你的項(xiàng)目中。
Redis : 一個(gè)開(kāi)源的使用ANSI C語(yǔ)言編寫(xiě)、遵守BSD協(xié)議、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫(kù).
MongoDB : 一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù)
調(diào)試
Boost.Test : Boost測(cè)試庫(kù)
Catch : 一個(gè)很時(shí)尚的,C++原生的框架,只包含頭文件,用于單元測(cè)試,測(cè)試驅(qū)動(dòng)開(kāi)發(fā)和行為驅(qū)動(dòng)開(kāi)發(fā)。
CppUnit : 由JUnit移植過(guò)來(lái)的C++測(cè)試框架
CTest : CMake測(cè)試驅(qū)動(dòng)程序
GoogleTest : 谷歌C++測(cè)試框架
ig-debugheap : 用于跟蹤內(nèi)存錯(cuò)誤的多平臺(tái)調(diào)試堆
libtap : 用C語(yǔ)言編寫(xiě)測(cè)試
MemTrack : 用于C++跟蹤內(nèi)存分配
MicroProfile : 跨平臺(tái)的網(wǎng)絡(luò)試圖分析器
minUnit : 使用C寫(xiě)的迷你單元測(cè)試框架,只使用了兩個(gè)宏
Remotery : 用于web視圖的單一C文件分析器
UnitTest++ : 輕量級(jí)的C++單元測(cè)試框架
容器
C++ B-Tree : 基于B樹(shù)數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)命令內(nèi)存容器的模板庫(kù)
Hashmaps : C++中開(kāi)放尋址哈希表算法的實(shí)現(xiàn)
游戲引擎
Cocos2d-x : 一個(gè)跨平臺(tái)框架,用于構(gòu)建2D游戲,互動(dòng)圖書(shū),演示和其他圖形應(yīng)用程序。
Grit : 社區(qū)項(xiàng)目,用于構(gòu)建一個(gè)免費(fèi)的游戲引擎,實(shí)現(xiàn)開(kāi)放的世界3D游戲。
lrrlicht : C++語(yǔ)言編寫(xiě)的開(kāi)源高性能的實(shí)時(shí)#D引擎
PolyCode : C++實(shí)現(xiàn)的用于創(chuàng)建游戲的開(kāi)源框架(與Lua綁定)。
圖形庫(kù)
bgfx : 跨平臺(tái)的渲染庫(kù)
Cairo : 支持多種輸出設(shè)備的2D圖形庫(kù)
Horde3D : 一個(gè)小型的3D渲染和動(dòng)畫(huà)引擎
magnum : C++11和OpenGL 2D/3D 圖形引擎
Ogre 3D : 用C++編寫(xiě)的一個(gè)面向場(chǎng)景,實(shí)時(shí),靈活的3D渲染引擎(并非游戲引擎)
OpenSceneGraph : 具有高性能的開(kāi)源3D圖形工具包
Panda3D : 用于3D渲染和游戲開(kāi)發(fā)的框架,用Python和C++編寫(xiě)。
Skia : 用于繪制文字,圖形和圖像的完整的2D圖形庫(kù)
urho3d : 跨平臺(tái)的渲染和游戲引擎。
圖像處理
Boost.GIL : 通用圖像庫(kù)
CImg : 用于圖像處理的小型開(kāi)源C++工具包
FreeImage : 開(kāi)源庫(kù),支持現(xiàn)在多媒體應(yīng)用所需的通用圖片格式和其他格式。
GDCM : Grassroots DICOM 庫(kù)
ITK : 跨平臺(tái)的開(kāi)源圖像分析系統(tǒng)
Magick++ : ImageMagick程序的C++接口
OpenCV : 開(kāi)源計(jì)算機(jī)視覺(jué)類(lèi)庫(kù)
tesseract-ocr : OCR引擎
VIGRA : 用于圖像分析通用C++計(jì)算機(jī)視覺(jué)庫(kù)
VTK : 用于3D計(jì)算機(jī)圖形學(xué),圖像處理和可視化的開(kāi)源免費(fèi)軟件系統(tǒng)。
國(guó)際化
gettext : GNU gettext
IBM ICU : 提供Unicode 和全球化支持的C、C++ 和Java庫(kù)
libiconv : 用于不同字符編碼之間的編碼轉(zhuǎn)換庫(kù)
Json庫(kù)
frozen : C/C++的Jason解析生成器
Jansson : 進(jìn)行編解碼和處理Jason數(shù)據(jù)的C語(yǔ)言庫(kù)
jbson : C++14中構(gòu)建和迭代BSON data,和Json 文檔的庫(kù)
JeayeSON : 非常健全的C++ JSON庫(kù),只包含頭文件
JSON++ : C++ JSON 解析器
json-parser : 用可移植的ANSI C編寫(xiě)的JSON解析器,占用內(nèi)存非常少
json11 : 一個(gè)迷你的C++11 JSON庫(kù)
jute : 非常簡(jiǎn)單的C++ JSON解析器
ibjson : C語(yǔ)言中的JSON解析和打印庫(kù),很容易和任何模型集成
libjson : 輕量級(jí)的JSON庫(kù)
PicoJSON : C++中JSON解析序列化,只包含頭文件
Qt-Json : 用于JSON數(shù)據(jù)和 QVariant層次間的相互解析的簡(jiǎn)單類(lèi)
QJson : 將JSON數(shù)據(jù)映射到QVariant對(duì)象的基于Qt的庫(kù)
RepidJSON : 用于C++的快速JSON 解析生成器,包含SAX和DOM兩種風(fēng)格的API
YAJL : C語(yǔ)言中快速流JSON解析庫(kù)
日志
Boost.Log : 設(shè)計(jì)非常模塊化,并且具有擴(kuò)展性
easyloggingpp : C++日志庫(kù),只包含單一的頭文件。
Log4cpp : 一系列C++類(lèi)庫(kù),靈活添加日志到文件,系統(tǒng)日志,IDSA和其他地方。
templog : 輕量級(jí)C++庫(kù),可以添加日志到你的C++應(yīng)用程序中
機(jī)器學(xué)習(xí),人工智能
btsk : 游戲行為樹(shù)啟動(dòng)器工具
Evolving Objects : 基于模板的,ANSI C++演化計(jì)算庫(kù),能夠幫助你非常快速地編寫(xiě)出自己的隨機(jī)優(yōu)化算法。
Caffe : 快速的神經(jīng)網(wǎng)絡(luò)框架
CCV : 以C語(yǔ)言為核心的現(xiàn)代計(jì)算機(jī)視覺(jué)庫(kù)
mlpack : 可擴(kuò)展的C++機(jī)器學(xué)習(xí)庫(kù)
OpenCV : 開(kāi)源計(jì)算機(jī)視覺(jué)庫(kù)
Recommender : 使用協(xié)同過(guò)濾進(jìn)行產(chǎn)品推薦/建議的C語(yǔ)言庫(kù)。
SHOGUN : Shogun 機(jī)器學(xué)習(xí)工具
sofia-ml : 用于機(jī)器學(xué)習(xí)的快速增量算法套件
數(shù)學(xué)庫(kù)
Armadillo : 高質(zhì)量的C++線性代數(shù)庫(kù),速度和易用性做到了很好的平衡。語(yǔ)法和MatlAB很相似
blaze : 高性能的C++數(shù)學(xué)庫(kù),用于密集和稀疏算法。
ceres-solver : 來(lái)自谷歌的C++庫(kù),用于建模和解決大型復(fù)雜非線性最小平方問(wèn)題。
CGal : 高效,可靠的集合算法集合
CML : 用于游戲和圖形的免費(fèi)C++數(shù)學(xué)庫(kù)
Eigen : 高級(jí)C++模板頭文件庫(kù),包括線性代數(shù),矩陣,向量操作,數(shù)值解決和其他相關(guān)的算法。
GMTL : 數(shù)學(xué)圖形模板庫(kù)是一組廣泛實(shí)現(xiàn)基本圖形的工具。
GMP : 用于個(gè)高精度計(jì)算的C/C++庫(kù),處理有符號(hào)整數(shù),有理數(shù)和浮點(diǎn)數(shù)。
多媒體庫(kù)
GStreamer : 構(gòu)建媒體處理組件圖形的庫(kù)
LIVE555 Streaming Media : 使用開(kāi)放標(biāo)準(zhǔn)協(xié)議(RTP/RTCP, RTSP, SIP) 的多媒體流庫(kù)
libVLC : libVLC (VLC SDK)媒體框架
QtAV : 基于Qt和FFmpeg的多媒體播放框架,能夠幫助你輕而易舉地編寫(xiě)出一個(gè)播放器
SDL : 簡(jiǎn)單直控媒體層
SFML : 快速,簡(jiǎn)單的多媒體庫(kù)
物理學(xué)
Box2D : 2D的游戲物理引擎。
Bullet : 3D的游戲物理引擎。
Chipmunk : 快速,輕量級(jí)的2D游戲物理庫(kù)
LiquidFun : 2D的游戲物理引擎
ODE : 開(kāi)放動(dòng)力學(xué)引擎-開(kāi)源,高性能庫(kù),模擬剛體動(dòng)力學(xué)。
ofxBox2D : Box2D開(kāi)源框架包裝器。
Simbody : 高性能C++多體動(dòng)力學(xué)/物理庫(kù),模擬關(guān)節(jié)生物力學(xué)和機(jī)械系統(tǒng),像車(chē)輛,機(jī)器人和人體骨骼。
機(jī)器人學(xué)
MOOS-Ivp : 一組開(kāi)源C++模塊,提供機(jī)器人平臺(tái)的自主權(quán),尤其是自主的海洋車(chē)輛。
MRPT : 移動(dòng)機(jī)器人編程工具包
PCL : 點(diǎn)云庫(kù)是一個(gè)獨(dú)立的,大規(guī)模的開(kāi)放項(xiàng)目,用于2D/3D圖像和點(diǎn)云處理。
Robotics Library : 一個(gè)獨(dú)立的C++庫(kù),包括機(jī)器人動(dòng)力學(xué),運(yùn)動(dòng)規(guī)劃和控制。
RobWork : 一組C++庫(kù)的集合,用于機(jī)器人系統(tǒng)的仿真和控制。
ROS : 機(jī)器人操作系統(tǒng),提供了一些庫(kù)和工具幫助軟件開(kāi)發(fā)人員創(chuàng)建機(jī)器人應(yīng)用程序。
科學(xué)計(jì)算
FFTW : 用一維或者多維計(jì)算DFT的C語(yǔ)言庫(kù)。
GSL : GNU科學(xué)庫(kù)。
腳本
ChaiScript : 用于C++的易于使用的嵌入式腳本語(yǔ)言。
Lua : 用于配置文件和基本應(yīng)用程序腳本的小型快速腳本引擎。
luacxx : 用于創(chuàng)建Lua綁定的C++ 11 API
SWIG : 一個(gè)可以讓你的C++代碼鏈接到JavaScript,Perl,PHP,Python,Tcl和Ruby的包裝器/接口生成器
V7 : 嵌入式的JavaScript 引擎。
V8 : 谷歌的快速JavaScript引擎,可以被嵌入到任何C++應(yīng)用程序中。
序列化
Cap'n Proto : 快速數(shù)據(jù)交換格式和RPC系統(tǒng)。
cereal : C++11 序列化庫(kù)
FlatBuffers : 內(nèi)存高效的序列化庫(kù)
MessagePack : C/C++的高效二進(jìn)制序列化庫(kù),例如 JSON
ProtoBuf : 協(xié)議緩沖,谷歌的數(shù)據(jù)交換格式。
ProtoBuf-c : C語(yǔ)言的協(xié)議緩沖實(shí)現(xiàn)
SimpleBinaryEncoding : 用于低延遲應(yīng)用程序的對(duì)二進(jìn)制格式的應(yīng)用程序信息的編碼和解碼。
Thrift : 高效的跨語(yǔ)言IPC/RPC,用于C++,Java,Python,PHP,C#和其它多種語(yǔ)言中,最初由Facebook開(kāi)發(fā)。
視頻庫(kù)
libvpx : VP8/VP9編碼解碼SDK
FFMpeg : 一個(gè)完整的,跨平臺(tái)的解決方案,用于記錄,轉(zhuǎn)換視頻和音頻流。
libde265 : 開(kāi)放的h.265視頻編解碼器的實(shí)現(xiàn)。
OpenH264 : 開(kāi)源H.364 編解碼器。
Theora : 免費(fèi)開(kāi)源的視頻壓縮格式。
XML庫(kù)
Expat : 用C語(yǔ)言編寫(xiě)的xml解析庫(kù)
LibXml2 : Gnome的xml C解析器和工具包
LibXml++ : C++的xml解析器
PugiXML : 用于C++的,支持XPath的輕量級(jí),簡(jiǎn)單快速的XML解析器。
RapidXML : 試圖創(chuàng)建最快速的XML解析器,同時(shí)保持易用性,可移植性和合理的W3C兼容性。
TinyXML : 簡(jiǎn)單小型的C++XML解析器,可以很容易地集成到其它項(xiàng)目中。
TinyXML2 : 簡(jiǎn)單快速的C++CML解析器,可以很容易集成到其它項(xiàng)目中。
TinyXML++ : TinyXML的一個(gè)全新的接口,使用了C++的許多許多優(yōu)勢(shì),模板,異常和更好的異常處理。
Xerces-C++ : 用可移植的C++的子集編寫(xiě)的XML驗(yàn)證解析器。
專(zhuān)注于服務(wù)器后臺(tái)開(kāi)發(fā),包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,TCP/IP,協(xié)程,DPDK技術(shù)分享,Linux后端開(kāi)發(fā)配套視頻資料,與一線互聯(lián)網(wǎng)企業(yè)架構(gòu)內(nèi)部分享資料。(c/c++開(kāi)發(fā)者的寶藏庫(kù))
關(guān)注,私信【框架】統(tǒng)統(tǒng)帶走,就想要個(gè)贊~
*請(qǐng)認(rèn)真填寫(xiě)需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。