2011-09-30 52 views
17

誰かが、ランダムフォレストを2.3.1 API MatではなくcvMatで使用している例はありますか?OpenCV - ランダムフォレストの例

基本的には、16x16x3要素の1000行からなるMatrix Matデータと、各行がどのクラスに属しているかを保持する1000x1行列に応答します。私はこれにランダムなフォレストアルゴリズムを実行したいと思います。

+1

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

答えて

0

あなたはすでに適切なフォーマットでデータを取得しています。残っているのは、CvRTreesオブジェクトをインスタンス化して予測を行うことだけです。

ランダムツリーv2.3のドキュメントはhereです。また、実際にCvRTree::trainのほとんどのパラメータの説明が記載されているCvStatModel::train()のマニュアルを参照してください。トムはあなたが使うはずのコメントの良い例を参考にしました。

データとともに、各属性のタイプを指定するにはMatが必要です。このMatは、各入力属性に対して1つの行と、出力タイプに1つの行を追加します(したがって、あなたの場合は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); 
関連する問題