在SVM中找到预测的置信度

时间:2015-01-02 07:39:41

标签: c++ opencv machine-learning svm

我在opencv中使用SVM分类器进行英文数字分类。 我能够使用predict()函数预测类。 但我希望在0-1之间获得预测的信心。有人可以使用opencv

提供一种方法
 //svm parameters used
 m_params.svm_type    = CvSVM::C_SVC;
 m_params.kernel_type = CvSVM::RBF;
 m_params.term_crit   = cvTermCriteria(CV_TERMCRIT_ITER, 500, 1e-8);

 //for training
 svmob.train_auto(m_features, m_labels, cv::Mat(), cv::Mat(), m_params, 10);

 //for prediction
 predicted = svmob.predict(testData);

1 个答案:

答案 0 :(得分:10)

训练期间的SVM试图找到一个分离的超平面,使得火车组的例子位于不同的侧面。可能存在许多这样的超平面(或者没有),因此为了选择“最佳”,我们寻找与所有类的总距离最大化的那个。实际上,距离超平面点越远 - 我们对决策的信心越大。所以我们感兴趣的是与超平面的距离。

根据OpenCV documentationCvSVM::predict有一个默认的第二个参数,用于指定返回的内容。默认情况下,它会返回分类标签,但您可以传入true并返回距离。

距离本身非常好,但是如果你想在一个范围(0,1)中有一个置信度值,你可以将sigmoidal函数应用于结果。其中一个功能就是逻辑功能。

decision = svmob.predict(testData, true);
confidence = 1.0 / (1.0 + exp(-decision));