程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> AdaBoost C++實現

AdaBoost C++實現

編輯:關於C++

每個弱分類器的分類結果加權相加後,再用sign函數激活,得到最終分類結果。這裡的權就是alpha
alpha根據每個弱分類器的分類錯誤率算出,alpha = 0.5 * ln( (1-errorRate) / errorRate )

本算法中的弱分類器為單決策樹,在構建單決策樹時,會根據加權錯誤率來衡量其性能
被分錯的樣本權重高,權重計算:D[i] = D[i] * e^(-1 * alpha * label[i]) / sum(D)

在AdaBoost訓練過程中,每一次迭代都會更新D,D是AdaBoost與各弱分類器交互的地方
每一次迭代都會創建一個弱分類器,並存儲下來
當分類錯誤率很小,或者迭代次數夠了時,AdaBoos訓練結束

#include 
#include 
#include 
#include 
#include 
#include
#include 
using namespace std;

double e = 2.718281828459;

double data[5][2] =   //數據集
{
	{1,   2.1},
	{2,   1.1},
	{1.3, 1},
	{1,   1},
	{2,   1}
};

double label[] = {1, 1, -1, -1, 1};  //標簽

//通過阈值比較對數據分類,在阈值一邊的會分到-1,另一邊的會分到1
//threshIneq用於在大於、小於號之間切換,0表示小於號,1表示大於號
vector stumpClassify(vector< vector > &data, int dimen, double threshVal, int threshIneq)
{
	int N = data.size();
	vector retLabel(N);
	if(threshIneq == 0)
	{
		for(int i=0; i threshVal)
				retLabel[i] = -1;
			else
				retLabel[i] = 1;
	}
	return retLabel;
}

//單層決策樹生成函數
//D為權重向量,對於分類正確的樣例,權值較小,分類錯誤的樣例,權值較大
//minError, bestClassEst為輸出值,分別表示最小誤差,預測結果
vector buildStump(vector< vector > &data,  vector &D, double &minError, vector &bestClassEst)
{
	int N = data.size();
	int M = data[0].size();
	int numSteps = 10;
	int i, j;
	vector bestStump(3);  //存儲最佳單決策樹信息,分別表示特征下標、阈值、不等號
	minError = 10000000;
	for(i=0; i rangeMax)
				rangeMax = data[j][i];
		}
		int stepSize = (rangeMax - rangeMin) / numSteps;  //步長
		for(j=-1; j<=stepSize; j++)  //阈值也可以設為取值范圍之外
		{
			double threshVal = rangeMin + j * stepSize;
			for(int inequal = 0; inequal < 2; inequal++)  //在大於、小於之間切換不等式
			{
				vector predictVals = stumpClassify(data, i, threshVal, inequal);  //預測結果
				double weightedError = 0;
				for(int k=0; k b ? a : b;
}

double sign(double a)
{
	if(a > 0)
		return 1;
	else 
		return -1;
}

//基於單層決策樹的AdaBoost訓練過程
//numIt為迭代次數
vector< vector > adaBoostTrainDS(vector< vector > &data, int numIt)
{
	int N = data.size();
	int M = data[0].size();
	vector< vector > weakClassArr;  //存儲弱分類器
	vector D(N);   //每個樣例的權重,被分錯的樣例權重大
	int i, j;
	for(i=0; i aggClassEst(N);  //所有弱分類器的預測加權結果
	for(i=0; i classEst;
		vector bestStump = buildStump(data, D, error, classEst);         //預測
		double alpha = 0.5 * log( (1.0 - error) / max(error, 0.000001) ) / log(e);  //弱分類器的權重
		bestStump.push_back(alpha);
		weakClassArr.push_back(bestStump);  //存儲弱分類器
		//為下一次迭代,計算每個樣例的權重D
		double Dsum = 0;
		for(j=0; j adaClassify(vector< vector > &test, int n, vector< vector > &classifierArr)
{
	vector aggClassEst(n);
	int i;
	for(i=0; i classEst = stumpClassify(test, (int)classifierArr[i][0], classifierArr[i][1], (int)classifierArr[i][2]);
		for(int j=0; j > d(5, vector(M));
	for(i=0; i > t(n, vector(M));
	for(i=0; i > classifierArr = adaBoostTrainDS(d, 30);
	vector result = adaClassify(t, n, classifierArr);

	cout << "預測結果:" << endl;
	for(i=0; i
運行結果:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved