Я хочу использовать AdaBoost, чтобы выбрать хороший набор функций из большого числа (~ 100k). AdaBoost работает, повторяя набор функций и добавляя функции в зависимости от того, насколько хорошо они преформуются. Он выбирает функции, которые хорошо преформуются на образцах, которые были неправильно классифицированы существующим набором функций.
Я в настоящее время использую в открытых резюме CvBoost
, Я получил пример работы, но из документация не ясно, как вытащить индексы функций, которые он использовал.
Используя либо CvBoost
, сторонняя библиотека или ее реализация самостоятельно, как можно извлечь набор функций из большого набора функций с помощью AdaBoot?
Заявка: я не пользователь opencv. Из документации adaboost от opencv использует Древо решений (либо дерево классификации, либо дерево регрессии) в качестве основного слабого ученика.
Мне кажется, это путь к подчеркнуть слабых учеников:
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
и выставить любую функциональность.
С помощью ответа @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;
}