2013-12-07 5 views
0

Я использовал OpenCV SVM из этого примера 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

Вам необходимо показать нам, – Bull

ответ

0

кажется, что ваша проблема заключается в обнаружении «истинно» и «ложно», на самом деле ваш код не должен даже компилировать (1 отверстие bracet и 2 закрывающих них)

if (p > 0.0) || p<0.0) { 
     t++; 
    } 
    else { 
     f++; 
    } 

вы даете модель «точка» iff p!=0.0, поэтому вы получаете 100%. Вы должны сравнить прогноз вашего SVM с значением true этой точки. И если они одинаковые - увеличьте счетчик t и увеличьте f иначе.

Смежные вопросы