设为首页 加入收藏

TOP

AdaBoost C++实现
2016-12-06 20:24:47 】 浏览:328
Tags:AdaBoost 实现

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

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇c++三大特性之继承 下一篇数独 约束求解 C++ and Python

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目