Boosting原理
众做周知,boosting就是所谓的有多个弱分类器组成一个强分类器。而什么叫做弱分类学习和什么时候需要使用弱分类学习呢?
弱分类学习
弱分类学习:识别一组概念的正确率仅比随机猜的概率高一点。
同理,当需要分类的训练组具有上述特点时,可以优先考虑使用boosting算法。
Boosting的重要历史事件
- Kearns & Valiant (1984) : Boosting由来
- Kearns & Valiant (1989) : 证明了弱学习器和强学习器的等价问题。
- Schapire (1989) : 第一个提出了一个可证明的多项式事件的Boosting算法。
- Schapire ( 1993) : 第一次把Boosting算法思想用于实际应用(OCR)。
- Freund & Schapire (1995) : AdaBoost算法。
Boosting的原理
为了训练一系列弱分类器h1,h2,..hT,不断的对样本进行分类,每次分类后,主要关注错误的样本,计算本次分类的权重,然后将错误的样本进行下一次的分类器学习,如此类推。
最终将所有弱分类器组合起来:
AdaBoost算法
Boosting在OpenCV中实现训练图像组
CvBoostParams
这个类主要是对Boosting的设定,例如设定使用哪种boosting和一些训练的参数,本身是有默认值的,所以如果不设定的话,可以直接使用默认值。
默认值如下:
CvBoostParams::CvBoostParams()
{
boost_type = CvBoost::REAL;
weak_count = ;
weight_trim_rate = ;
cv_folds = ;
max_depth = ;
}
如果需要设定,则设定方法如下:
CvBoostParams params(CvBoost::DISCRETE,,,,);
CvBoostParams::train
void boosting_train(vector<Mat> mats,vector<int> response,int class_count=)
{
CvBoost boost; //使用默认值
if(mats.size()!=)
{
int total=mats[].cols*mats[].rows;
Mat mat=Mat(total,mats.size(),CV_64FC1);
for(int i=;i<mats.size();i++)
{
Mat col_tmp=mat.col(i);
mats[i].reshape(,total).col().convertTo(col_tmp,CV_64FC1,/);
}
Mat resp=Mat(mats.size(),,CV_64FC1);
for(int i=;i<response.size();i++)
{
resp.at(i,)=response[i];
}
boost.train(mat.t(),CV_ROW_SAMPLE,resp);
}
//为了使效果更好,可以样本数换成样本数乘以分类的数,即mats.size()换成mats.size()*class_count
}
参考文档:http://docs.opencv.org/modules/ml/doc/boosting.html
转载请注明出处:http://blog.csdn.net/luoyun614/article/details/44254269