我使用了此示例http://docs.opencv.org/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html中的OpenCV SVM。
现在我需要测试这个SVM对于我的预测值的准确性。这是我的代码中用于预测SVM准确性的部分。
void svm(cv::Mat& trainingDataMat, cv::Mat& labelsMat, cv::Mat& Testdata) {
int t=0;
int f=0;
int Acc;
CvSVMParams params;
params.svm_type = CvSVM::C_SVC;
params.kernel_type = CvSVM::LINEAR;
params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);
CvSVM SVM;
SVM.train(trainingDataMat, labelsMat, Mat(), Mat(), params);
cv::Mat predicted(1,1, CV_32F);
for(int i = 0; i < Testdata.rows; i++) {
cv::Mat sample = Testdata.row(i);
predicted.at<float>(i,0)= SVM.predict(sample);
float p = predicted.at<float>(i,0);
if (p > 0.0) || p<0.0) {
t++;
}
else {
f++;
}
Acc=(t*1.0)/(t+f);
}
cout << "Accuracy_{SVM} = " <<Acc << endl;
}
我试图一次测试一个测试数据,并找出一行中的每一列是否属于训练分类器的正面或负面以及预测的准确性。
我在使用此代码时遇到的问题是预测百分比始终显示为100。
我发现这有点奇怪,希望有人帮我解决这个问题?
答案 0 :(得分:0)
似乎您的问题在于检测到“true”和“false”,实际上您的代码甚至不应该编译(1个开头支撑和2个关闭的支撑)
if (p > 0.0) || p<0.0) {
t++;
}
else {
f++;
}
如果你p!=0.0
,你给你的模型一个“点”,所以你得到的是100%。您应该将SVM的预测与此点的 true 值进行比较。如果它们相同 - 增加t
计数器,否则增加f
。