在 SVM 中找到预测的置信度
Find confidence of prediction in 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);
训练期间的 SVM 试图找到一个分离超平面,使训练集示例位于不同的侧面。可能有许多这样的超平面(或 none),因此对于 select "best" 我们寻找与所有 类 的总距离最大的那个。事实上,距离超平面点越远——我们对决策的信心就越大。所以我们感兴趣的是到超平面的距离。
根据 OpenCV documentation,CvSVM::predict
有一个默认的第二个参数,它指定要 return 的内容。默认情况下,它是return的分类标签,但你可以传入true
,它会return距离。
距离本身还不错,但如果你想在 (0, 1) 范围内获得置信度值,你可以对结果应用 sigmoidal 函数。如果逻辑函数是这样的函数之一。
decision = svmob.predict(testData, true);
confidence = 1.0 / (1.0 + exp(-decision));
我正在使用 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);
训练期间的 SVM 试图找到一个分离超平面,使训练集示例位于不同的侧面。可能有许多这样的超平面(或 none),因此对于 select "best" 我们寻找与所有 类 的总距离最大的那个。事实上,距离超平面点越远——我们对决策的信心就越大。所以我们感兴趣的是到超平面的距离。
根据 OpenCV documentation,CvSVM::predict
有一个默认的第二个参数,它指定要 return 的内容。默认情况下,它是return的分类标签,但你可以传入true
,它会return距离。
距离本身还不错,但如果你想在 (0, 1) 范围内获得置信度值,你可以对结果应用 sigmoidal 函数。如果逻辑函数是这样的函数之一。
decision = svmob.predict(testData, true);
confidence = 1.0 / (1.0 + exp(-decision));