我在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);
答案 0 :(得分:10)
训练期间的SVM试图找到一个分离的超平面,使得火车组的例子位于不同的侧面。可能存在许多这样的超平面(或者没有),因此为了选择“最佳”,我们寻找与所有类的总距离最大化的那个。实际上,距离超平面点越远 - 我们对决策的信心越大。所以我们感兴趣的是与超平面的距离。
根据OpenCV documentation,CvSVM::predict
有一个默认的第二个参数,用于指定返回的内容。默认情况下,它会返回分类标签,但您可以传入true
并返回距离。
距离本身非常好,但是如果你想在一个范围(0,1)中有一个置信度值,你可以将sigmoidal函数应用于结果。其中一个功能就是逻辑功能。
decision = svmob.predict(testData, true);
confidence = 1.0 / (1.0 + exp(-decision));