2011-09-30 13 views
17

Qualcuno ha qualche esempio di utilizzare le foreste casuali con il Mat API 2.3.1 e non con cvMat?OpenCV - Esempio di foresta casuale

Fondamentalmente ho un dato Mat Mat che consiste di 1000 righe con elementi 16x16x3 e una Mat Mat risponde a una matrice 1000x1 che contiene la classe a cui appartiene ogni riga. Mi piacerebbe eseguire l'algoritmo di foresta casuale su questo.

+1

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

risposta

0

Hai già ottenuto i dati nel formato corretto; non resta che istanziare un oggetto CvRTrees ed eseguire la tua previsione.

La documentazione per Random Trees v2.3 può essere trovata here. Dovrai anche esaminare la documentazione CvStatModel::train(), che in realtà ha la descrizione della maggior parte dei parametri per CvRTree::train. Tom ha fatto riferimento a un buon esempio completo nei commenti che dovresti usare.

Insieme ai dati, è necessario un tappetino per specificare il tipo di ciascun attributo. Questo tappetino ha una riga per ogni attributo di input e una riga aggiuntiva per il tipo di output (quindi 16x16x3 + 1 righe, nel tuo caso).

Opzionalmente, è possibile utilizzare un oggetto CvRTParams per specificare parametri come numero di alberi, profondità massima, ecc. Uso i valori predefiniti nell'esempio seguente.

Se lo si desidera, è possibile passare in valIdx e sampleIdx Mats che specificano quali attributi e quali righe di dati, rispettivamente, utilizzare per l'allenamento. Questo potrebbe essere utile per i training di selezione/i dati di validazione senza fare un po 'di ginnastica per ottenerli in Mats separati.

Ecco un rapido esempio:

#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);