我想使用AdaBoost从大量(~100 k)中选择一个很好的集合特性。AdaBoost的工作方式是迭代特性集,并根据它们的预置效果添加特性。它选择对现有特征集错误分类的样本进行良好预成形的特征。
我目前使用的开放简历的CvBoost。我得到了一个示例工作,但是从文档中还不清楚如何提取它所使用的特性索引。
使用CvBoost (第三方库)或自己实现它,如何使用AdaBoot从大型功能集中提取一组特性?
发布于 2014-09-21 21:44:29
声明:我不是opencv的用户。从文档中看,opencv的adaboost是使用决策树 (分类树或回归树)作为基础弱学习者。
在我看来这是通往让下划线弱的学习者的路
CvBoost::get_weak_predictors
Returns the sequence of weak tree classifiers.
C++: CvSeq* CvBoost::get_weak_predictors()
The method returns the sequence of weak classifiers.
Each element of the sequence is a pointer to the CvBoostTree class or
to some of its derivatives.一旦您能够访问CvBoostTree*序列,您应该能够检查树中包含哪些特性,以及拆分值等。
如果每一棵树只是一个决策树,那么每个弱学习者都只包含一个特征。但是,如果我们让树的深度更深,那么每个弱学习者都可能会有不同的特征组合。
我进一步查看了CvBoostTree 班级;不幸的是,该类本身并没有提供一个公共方法来检查所使用的内部特性。但是您可能想要创建您自己的子类,继承从CvBoostTree继承,并公开任何功能。
发布于 2014-09-27 19:48:57
在@greeness答案的帮助下,我创建了一个CvBoost子类
std::vector<int> RSCvBoost::getFeatureIndexes() {
CvSeqReader reader;
cvStartReadSeq( weak, &reader );
cvSetSeqReaderPos( &reader, 0 );
std::vector<int> featureIndexes;
int weak_count = weak->total;
for( int i = 0; i < weak_count; i++ ) {
CvBoostTree* wtree;
CV_READ_SEQ_ELEM( wtree, reader );
const CvDTreeNode* node = wtree->get_root();
CvDTreeSplit* split = node->split;
const int index = split->condensed_idx;
// Only add features that are not already added
if (std::find(featureIndexes.begin(),
featureIndexes.end(),
index) == featureIndexes.end()) {
featureIndexes.push_back(index);
}
}
return featureIndexes;
}https://stackoverflow.com/questions/25962349
复制相似问题