2011-09-30 204 views
17

有沒有人有使用隨機森林與2.3.1 API墊,而不是cvMat一些例子?OpenCV - 隨機森林示例

基本上我有一個矩陣矩陣數據,它由1000行16x16x3的元素組成,矩陣矩陣響應一個1000x1的矩陣來保存每行所屬的類。我想對此運行隨機森林算法。

+1

http://breckon.eu/toby/teaching/ml/examples/c++/opticaldigits_ex/randomforest.cpp –

回答

0

您已經獲得正確格式的數據;剩下的就是實例化一個CvRTrees對象並執行你的預測。

Random Trees v2.3的文檔可以找到here。您還需要查看CvStatModel::train()文檔,該文檔實際上對CvRTree::train的大多數參數進行了說明。湯姆在您應該使用的評論中引用了一個很好的完整示例。

隨着你的數據,你需要一個Mat來指定你的每個屬性的類型。這個Mat對於每個輸入屬性都有一行,對於輸出類型有一行(在你的情況下是16x16x3 + 1行)。

(可選)您可以使用CvRTParams對象來指定像樹數,最大深度等參數。我在下面的示例中使用默認值。

如果您願意,您可以傳入valIdx和sampleIdx Mats,它們分別指定要用於訓練的屬性和哪些數據行。這對於選擇訓練/驗證數據可能是有用的,而不需要做一堆體操就可以將它們放入單獨的墊子中。

這裏有一個簡單的例子:

#define ATTRIBUTES_PER_SAMPLE (16*16*3) 
// Assumes training data (1000, 16x16x3) are in training_data 
// Assumes training classifications (1000, 1) are in training_classifications 

// All inputs are numerical. You can change this to reflect your data 
Mat var_type = Mat(ATTRIBUTES_PER_SAMPLE + 1, 1, CV_8U); 
var_type.setTo(Scalar(CV_VAR_NUMERICAL)); // all inputs are numerical 

// Output is a category; this is classification, not regression 
var_type.at<uchar>(ATTRIBUTES_PER_SAMPLE, 0) = CV_VAR_CATEGORICAL; 

// Train the classifier 
CvRTrees* rtree = new CvRTrees; 
rtree->train(training_data, CV_ROW_SAMPLE, training_classifications, 
      Mat(), Mat(), var_type);