我使用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()
答案 0 :(得分: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);
希望这有助于你