众做周知,boosting就是所谓的有多个弱分类器组成一个强分类器。而什么叫做弱分类学习和什么时候需要使用弱分类学习呢?
弱分类学习:识别一组概念的正确率仅比随机猜的概率高一点。
同理,当需要分类的训练组具有上述特点时,可以优先考虑使用boosting算法。
为了训练一系列弱分类器h1,h2,..hT,不断的对样本进行分类,每次分类后,主要关注错误的样本,计算本次分类的权重,然后将错误的样本进行下一次的分类器学习,如此类推。
最终将所有弱分类器组合起来:
这个类主要是对Boosting的设定,例如设定使用哪种boosting和一些训练的参数,本身是有默认值的,所以如果不设定的话,可以直接使用默认值。
默认值如下:
CvBoostParams::CvBoostParams()
{
boost_type = CvBoost::REAL;
weak_count = 100;
weight_trim_rate = 0.95;
cv_folds = 0;
max_depth = 1;
}
如果需要设定,则设定方法如下:
CvBoostParams params(CvBoost::DISCRETE,100,0.95,0,1);
void boosting_train(vector<Mat> mats,vector<int> response,int class_count=2)
{
CvBoost boost; //使用默认值
if(mats.size()!=0)
{
int total=mats[0].cols*mats[0].rows;
Mat mat=Mat(total,mats.size(),CV_64FC1);
for(int i=0;i<mats.size();i++)
{
Mat col_tmp=mat.col(i);
mats[i].reshape(1,total).col(0).convertTo(col_tmp,CV_64FC1,1/255.);
}
Mat resp=Mat(mats.size(),1,CV_64FC1);
for(int i=0;i<response.size();i++)
{
resp.at(i,0)=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
原文地址:http://blog.csdn.net/luoyun614/article/details/44254269