2012-12-13 49 views
1

我用opencv做隨機森林,並且我已經成功地建立了森林。但是之後我需要使用predict_prob來知道樣本屬於第二類的確切機會。 我現在如何工作,但有一個錯誤說我的森林不是二元分類,我不能使用predict_prob。我如何製作我的森林二進制文件?我嘗試了很多方法並且到處搜索,但是對此沒有任何線索。無法形成二進制分類並使用predict_prob():隨機森林,opencv

這裏是我的代碼

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

,並在此之後,我可以使用預測()正確,但我不能用是U使用

回答

0

OpenCV的哪個版本的predict_prob()? 我在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); 

希望這有助於你