【问题标题】:Fail to form a binary classification and use predict_prob(): Random Forest, opencv无法形成二元分类并使用 predict_prob(): Random Forest, opencv
【发布时间】:2012-12-01 21:09:15
【问题描述】:

我用 opencv 做随机森林,我已经成功地建立了森林。但是然后我需要使用 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()

【问题讨论】:

    标签: opencv random binary classification


    【解决方案1】:

    你用的是哪个版本的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);
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2020-03-10
      • 1970-01-01
      • 2016-07-26
      • 2014-08-04
      • 2014-06-27
      • 1970-01-01
      • 2012-01-09
      • 2023-03-21
      • 2020-06-14
      相关资源
      最近更新 更多