Как использовать AdaBoost для выбора функций?

Я хочу использовать AdaBoost, чтобы выбрать хороший набор функций из большого числа (~ 100k). AdaBoost работает, повторяя набор функций и добавляя функции в зависимости от того, насколько хорошо они преформуются. Он выбирает функции, которые хорошо преформуются на образцах, которые были неправильно классифицированы существующим набором функций.

Я в настоящее время использую в открытых резюме CvBoost, Я получил пример работы, но из документация не ясно, как вытащить индексы функций, которые он использовал.

Используя либо CvBoost, сторонняя библиотека или ее реализация самостоятельно, как можно извлечь набор функций из большого набора функций с помощью AdaBoot?

2

Решение

Заявка: я не пользователь 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 и выставить любую функциональность.

2

Другие решения

С помощью ответа @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;
}
3

По вопросам рекламы [email protected]