Я пытаюсь построить матрицу путаницы из набора предсказания 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;
}
Любой знает, почему?
еще не понял код, но в первую очередь я бы попытался нормализовать 'confMat [i] [x]' с 'exCount [i]' – user463035818
Вот что такое заключительные утверждения cout. Я хотел сохранить матрицу предсказаний как отдельную сущность, confMat. также exCount - общее количество вхождений каждого типа/метки, поэтому не завершено до конца цикла, exCount [i] может не быть полной суммой для нормализации. –