2014-09-21 5 views
2

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

Использование В настоящее время используется при открытии CV CvBoost. Я получил example working, но из documentation неясно, как вытащить индексы функций, которые он использовал.

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

+0

Это кажется не по теме, по нескольким причинам: не ясный вопрос, запросы сторонних библиотек, упрямый и широким. – JBentley

+1

@JBentley - Спасибо за ваш комментарий. Я бы сказал, что вопрос ясен - как я могу заставить AdaBoost работать для выбора функции. Тело вопроса действительно показывает, что я сделал некоторую работу в этой области. Я не хочу рекомендации сторонней библиотеки, однако если решение будет использовать стороннюю библиотеку, тогда это было бы здорово. Я бы приветствовал предложения относительно того, как этот вопрос можно улучшить, потому что я действительно хотел бы получить полезные ответы. – Robert

ответ

2

Претензия: Я не являюсь пользователем opencv. Из документации adaboost opencv использует decision tree (дерево классификации или дерево регрессии) как основной слабый ученик.

Мне кажется, что это путь к get the underline weak learners:

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*, вы должны иметь возможность проверить, какие функции содержатся в дереве и какой раскол значение и т. д.

Если каждое дерево является только решающим культи, в каждом слабого учащегося содержится только одна особенность. Но если мы допускаем более глубокую глубину дерева, в каждом отдельном слабом ученике может существовать комбинация признаков.

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

+0

Это выглядит великолепно, спасибо! Мне любопытно, если вы не открытое резюме, знаете ли вы какой-либо другой пакет обучения на компьютере или вы изучали ответ с нуля? – Robert

+0

np. У меня есть опыт работы с adaboost (написано мой собственный код), поэтому я знаю общую идею. – greeness

+0

В конце концов, я понял, спасибо за вашу помощь :) – Robert

3

С помощью @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; 
} 
+0

Вы могли это вытащить? Я имел в виду, способный извлечь функции таким образом? – 4nonymou5

+1

Да - Казалось, это сработало. Я тестировал его, тренируя по серии x, y точек, где метка была истина, если x^2 + y^2> некоторый порог. Я добавил третий параметр z, который был случайным шумом, и добавил небольшое количество случайных шумов к y, но не x. Алгоритм выбрал x, затем y, а затем z, что и следовало ожидать. – Robert