AdaBoost C++实现

AdaBoost C++实现_第1张图片

 

   每个弱分类器的分类结果加权相加后,再用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


运行结果:

AdaBoost C++实现_第2张图片

你可能感兴趣的:(机器学习笔记)