我想使用AdaBoost從大量(〜100k)中選擇一個好的設置功能。 AdaBoost通過迭代功能集來添加功能,並根據預成型效果添加功能。它選擇對現有功能集錯誤分類的樣本進行預處理的功能。如何使用AdaBoost進行功能選擇?
我目前正在使用Open CV的CvBoost
。我得到了一個example working,但從documentation不清楚如何提取它使用的特徵索引。
使用CvBoost
(第三方庫或自己實現),如何使用AdaBoot從大型功能集中提取一組功能?
我想使用AdaBoost從大量(〜100k)中選擇一個好的設置功能。 AdaBoost通過迭代功能集來添加功能,並根據預成型效果添加功能。它選擇對現有功能集錯誤分類的樣本進行預處理的功能。如何使用AdaBoost進行功能選擇?
我目前正在使用Open CV的CvBoost
。我得到了一個example working,但從documentation不清楚如何提取它使用的特徵索引。
使用CvBoost
(第三方庫或自己實現),如何使用AdaBoot從大型功能集中提取一組功能?
索賠:我不是opencv的用戶。從文檔中,opencv的adaboost使用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*
序列,你應該能夠檢查其功能包含在樹上,什麼是分裂值等。
如果每棵樹只是一個決策樹,每個弱學習者只包含一個特徵。但是如果我們允許更深入的樹,每個單獨的弱學習者都可能存在特徵的組合。
我進一步看了一下CvBoostTree
class;不幸的是,該類本身不提供公共方法來檢查所使用的內部特徵。但是你可能想創建自己的繼承自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;
}
一個子類,這似乎是題外話有以下幾個原因:沒有明確的問題,對於第三方庫,自以爲是,和廣泛的請求。 – JBentley 2014-09-21 18:26:31
@JBentley - 感謝您的評論。我認爲問題很清楚 - 我如何讓AdaBoost爲特徵選擇工作。問題的實質是真的表明我在這方面做了一些小腿工作。我不想要第三方圖書館的建議,但是如果解決方案是使用第三方庫,那就太好了。我很樂意就如何改善這個問題提出建議,因爲我真的想得到一些有用的答覆。 – Robert 2014-09-21 18:37:15