1

opencv を使用してランダム フォレストを実行し、フォレストを正常に構築しました。しかし、サンプルが 2 番目のクラスに属する正確な確率を知るには、predict_prob を使用する必要があります。今はどのように機能するかですが、フォレストがバイナリ分類ではないというエラーがあり、predict_prob を使用できません。フォレストをバイナリにするにはどうすればよいですか? 私は多くの方法を試し、どこでも検索しましたが、これについての手がかりが見つかりません。

これが私のコードです

CvMat* data = 0;  
CvMat* responses = 0;  
CvMat* var_type = 0;  

//I skipped some lines

data=cvCreateMat(row_s,1024,CV_32FC1);
responses=cvCreateMat(row_s,1,CV_32FC1);

//load data and responses, responses consist of only 1 and 0

var_type = cvCreateMat( data->cols + 1, 1, CV_8U );  
cvSet( var_type, cvScalarAll(CV_VAR_ORDERED) );  
cvSetReal1D( var_type, data->cols, CV_VAR_CATEGORICAL ); 

CvRTrees forest;
forest.train(data,  CV_ROW_SAMPLE, responses, 0, 0, var_type, 0, 
CvRTParams( 5, 20, 0, false, 2, 0, false, 100, 10, 0, CV_TERMCRIT_ITER ));

この後、predict() は正しく使用できますが、predict_prob() は使用できません

4

1 に答える 1

0

どのバージョンの opencv を使用していますか? バージョン2.4.3でも同じことをしています。私たちが行っていることとの唯一の大きな違いは、C++ スタイルのコードを使用していることです。これが私のコードです。これは私にとってはうまくいきます。

void train(){
    cv::Mat types(numberOfClassifierDimensions + 1, 1, CV_8UC1);
    types.setTo(cv::Scalar(CV_VAR_NUMERICAL));
    types.at<char>(numberOfClassifierDimensions, 0) = CV_VAR_CATEGORICAL;

    cv::Mat dataset(0, numberOfClassifierDimensions, CV_32FC1);
    cv::Mat classes(0, 1, CV_8UC1);
    for (int i = 0 ; i < featureWeightsPositive.rows ; ++i){
        dataset.push_back(featureWeightsPositive.row(i));
        classes.push_back(1);
    }
    for (int i = 0 ; i < featureWeightsNegative.rows; ++i){
        dataset.push_back(featureWeightsNegative.row(i));
        classes.push_back(0);
    }

    classifier.train(dataset, classes, types);
}

//the classifier.train() function
void train(cv::Mat trainingData, cv::Mat classifications, cv::Mat varType){

    std::vector<float> priorsVect(numberOfClasses, 1);
    float* priors = &priorsVect[0];


        // define the parameters for training the random forest (trees)
        CvRTParams params = CvRTParams(25, 5, 0, false, 15, priors, false, 4, 100, 0.01f, CV_TERMCRIT_ITER | CV_TERMCRIT_EPS );

        // train random forest classifier (using training data)
        rtree->train(trainingData, CV_ROW_SAMPLE, classifications,
                     cv::Mat(), cv::Mat(), varType, cv::Mat(), params);

}

この初期化の後、次のように呼び出すことができます。

rtree->predict_prob(sample);

これがお役に立てば幸いです

于 2013-03-11T10:22:17.930 に答える