2015-07-01 3 views
2

Я пытаюсь построить матрицу путаницы из набора предсказания SVM на основе поезда OpenCV SVM и предсказать функцию так:C++ спутанность матрица ошибок

void testClassifier(CvSVM & SVM, 
    std::vector<std::vector<float>> & test_samples, 
    std::vector<float> & test_labels, 
    const CvSVMParams & params, 
    double & tempAcc) 
{ 
    cv::Mat matSamp; 
    int response; 
    int cnt = 0; 
    //std::vector<int> labels = { 0, 1, 2, 3, 4, 5, 6 }; 
    std::vector<int> exCount = { 0, 0, 0, 0, 0, 0, 0 }; 
    std::vector<std::vector<double>> confMat = { { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 } }; 


    //test classifier 
    for (unsigned int t = 0; t < test_samples.size(); t++) 
    { 
     matSamp = cv::Mat(test_samples[t].size(), 1, CV_32FC1, test_samples[t].data()); 
     response = SVM.predict(matSamp); 

     if (response == test_labels[t]) 
     { 
      cnt++; 
     } 

     exCount[test_labels[t]] += 1; 
     //cout << test_labels[t] << " " << exCount[test_labels[t]] << endl; 
     confMat[test_labels[t]][response] += 1.0; 
     //cout << confMat[test_labels[t]][response] << endl; 
    } 

    cout << "Parameters used: " << endl; 
    tempAcc = (double)cnt * 100/test_samples.size(); 
    cout << " C:    " << params.C << endl; 
    cout << " Gamma:   " << params.gamma << endl; 
    cout << "you hit " << tempAcc << "% accuracy" << endl << endl; 
    cout << confMat[0][0]/exCount[0] * 100 << " " << confMat[0][1]/exCount[1] * 100 << " " << confMat[0][2]/exCount[2] * 100 << " " << confMat[0][3]/exCount[3] * 100 << " " << confMat[0][4]/exCount[4] * 100 << " " << confMat[0][5]/exCount[5] * 100 << " " << confMat[0][6]/exCount[6] * 100 << endl; 
    cout << confMat[1][0]/exCount[0] * 100 << " " << confMat[1][1]/exCount[1] * 100 << " " << confMat[1][2]/exCount[2] * 100 << " " << confMat[1][3]/exCount[3] * 100 << " " << confMat[1][4]/exCount[4] * 100 << " " << confMat[1][5]/exCount[5] * 100 << " " << confMat[1][6]/exCount[6] * 100 << endl; 
    cout << confMat[2][0]/exCount[0] * 100 << " " << confMat[2][1]/exCount[1] * 100 << " " << confMat[2][2]/exCount[2] * 100 << " " << confMat[2][3]/exCount[3] * 100 << " " << confMat[2][4]/exCount[4] * 100 << " " << confMat[2][5]/exCount[5] * 100 << " " << confMat[2][6]/exCount[6] * 100 << endl; 
    cout << confMat[3][0]/exCount[0] * 100 << " " << confMat[3][1]/exCount[1] * 100 << " " << confMat[3][2]/exCount[2] * 100 << " " << confMat[3][3]/exCount[3] * 100 << " " << confMat[3][4]/exCount[4] * 100 << " " << confMat[3][5]/exCount[5] * 100 << " " << confMat[3][6]/exCount[6] * 100 << endl; 
    cout << confMat[4][0]/exCount[0] * 100 << " " << confMat[4][1]/exCount[1] * 100 << " " << confMat[4][2]/exCount[2] * 100 << " " << confMat[4][3]/exCount[3] * 100 << " " << confMat[4][4]/exCount[4] * 100 << " " << confMat[4][5]/exCount[5] * 100 << " " << confMat[4][6]/exCount[6] * 100 << endl; 
    cout << confMat[5][0]/exCount[0] * 100 << " " << confMat[5][1]/exCount[1] * 100 << " " << confMat[5][2]/exCount[2] * 100 << " " << confMat[5][3]/exCount[3] * 100 << " " << confMat[5][4]/exCount[4] * 100 << " " << confMat[5][5]/exCount[5] * 100 << " " << confMat[5][6]/exCount[6] * 100 << endl; 
    cout << confMat[6][0]/exCount[0] * 100 << " " << confMat[6][1]/exCount[1] * 100 << " " << confMat[6][2]/exCount[2] * 100 << " " << confMat[6][3]/exCount[3] * 100 << " " << confMat[6][4]/exCount[4] * 100 << " " << confMat[6][5]/exCount[5] * 100 << " " << confMat[6][6]/exCount[6] * 100 << endl; 
    cout << "enter for next matrix" << endl;/**/ 
    cin.get(); 
} 

но когда матричные элементы выводятся некоторые строки составляют более 100%, а некоторые меньше. Я уверен, что это что-то простое, но я смотрел на него целую вечность, не имея понятия. есть идеи?


UPDATE

Я не уверен, почему, но многократный cout я использовал повлияло на возвращаемое значение.

Проблема была решена путем включения отладки cout в цикле, как это:

for (unsigned int m = 0; m < 7; m++) 
{ 
    for (unsigned int n = 0; n < 7; n++) 
    { 
     confMat[m][n] = confMat[m][n] * 100/exCount[m]; 
     cout << confMat[m][n] << " "; 
    } 
    cout << endl; 
} 

Любой знает, почему?

+0

еще не понял код, но в первую очередь я бы попытался нормализовать 'confMat [i] [x]' с 'exCount [i]' – user463035818

+0

Вот что такое заключительные утверждения cout. Я хотел сохранить матрицу предсказаний как отдельную сущность, confMat. также exCount - общее количество вхождений каждого типа/метки, поэтому не завершено до конца цикла, exCount [i] может не быть полной суммой для нормализации. –

ответ

3

Похоже, я был прав с моей первой догадки. В оригинале вы нормировать так:

confMat[i][m]/exCount[m] * 100 

в правильном коде, нормализуют так:

confMat[m][i]/exCount[m] * 100 

В зависимости от того, exCount рассчитывает итоги по рядам или столбце только получить правильный ответьте на одну из приведенных выше строк.

+0

, поэтому, например, с помощью confMat [1] [2], я действительно обращался к 2-му элементу третьего вектора, а не к другому. Не мог бы confMat [1] быть вторым вектором? –

+0

@rfho_bdss хорошо ... Я всегда (действительно всегда) путаю строки с колонками, но, поскольку есть только две возможности, довольно легко исправить – user463035818

+0

Я буду помнить об этом в следующий раз, большое спасибо. –

1

Я не уверен, почему, но несколько экземпляров cout, которые я использовал, повлияли на возвращаемое значение.

путем включения отладки couts в цикле, как это:

for (unsigned int m = 0; m < 7; m++) 
{ 
    for (unsigned int n = 0; n < 7; n++) 
    { 
     confMat[m][n] = confMat[m][n] * 100/exCount[m]; 
     cout << confMat[m][n] << " "; 
    } 
    cout << endl; 
} 

отсортировано вопрос. кто-нибудь знает почему?

+0

Пожалуйста, удалите этот ответ. Я редактировал ваш вопрос, чтобы содержать этот текст. – Elyasin

+0

Я не вижу вашего редактирования, что вы имеете в виду? –

+0

Обновите свой браузер. См. Раздел ОБНОВЛЕНИЕ в вашем вопросе. – Elyasin

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

  • Нет связанных вопросов^_^