我的混淆矩阵的实现是否正确?或者这里有其他错误吗?

时间:2014-08-19 19:55:35

标签: matlab machine-learning classification svm feature-extraction

我训练了一个包含5个类的多类svm分类器,即svm(1)...svm(5).

然后我在训练这些分类器时使用了5张不习惯的图像进行测试。

然后用它们各自的分类器测试这5个图像。即如果从第一类中取出5张图像,则对同一类别进行测试。

  predict = svmclassify(svm(i_t),test_features);

预测产生一个5乘1的向量,显示结果。

-1
 1
 1
 1
-1

我对它们求和,然后将其插入对角矩阵。

理想情况下,当所有图像都被正确分类时,它应该是对角矩阵,对角线写入5。但结果非常糟糕。我的意思是在某些情况下我得到了负面结果。我只是想验证这个不好的结果是因为我的混淆矩阵不准确还是我应该使用其他特征提取器。

这是我写的代码

  svm_table = [];
  for i_t = 1:numel(svm)
      test_folder = [Path_training folders(i_t).name '\']; %select writer

         feature_count = 1; %Initialize count for feature vector accumulation

      for j_t = 6:10 %these 5 images that were not used for training
          [img,map] = imread([test_folder imlist(j_t).name]); 

          test_img = imresize(img, [100 100]);
          test_img = imcomplement(test_img);

          %Features extracted here for each image.
          %The feature vector for each image is a 1 x 16 vector.

          test_features(feature_count,:) = Features_extracted;
          %The feature vectors are accumulated in a single matrix. Each row is an image

          feature_count = feature_count + 1; % increment the count
      end
      test_features(isnan(test_features)) = 0; %locate Nan and replace with 0
      %I was getting NaN in some images, which was causing problems with svm, so just replaced with 0

      predict = svmclassify(svm(i_t),test_features); %produce column vector of preicts
      svm_table(end+1,end+1) = sum(predict); %sum them and add to matrix diagonally
  end

这就是我得到的。看起来像一个混乱矩阵,但结果很差。

-1     0     0     0     0
 0    -1     0     0     0
 0     0     3     0     0
 0     0     0     1     0
 0     0     0     0     1

所以我只想知道这里有什么问题。我实现了混淆矩阵。我测试svm或我选择的功能的方式。

2 个答案:

答案 0 :(得分:1)

我可以看到几个问题......

1)你正在使用的并不是真正的多类SVM。您采用了几种不同的SVM模型并将它们应用于相同的测试数据(不是真的相同)。您需要查看svmtrain的文档。当你使用它时,你给它两种数据,训练数据(每个训练图像的参数矢量)和组数据(与矢量相关的图像的类的矢量......)。你得到的将是一个SVM模型,它将决定其中一个选项。 (我通常使用libsvm,所以我不熟悉Matlabs SVM实现,但这应该是它的要点)

2)您的混淆矩阵导出不正确(请参阅:http://en.wikipedia.org/wiki/Confusion_matrix)。首先制作一个5x5零点矩阵来保存混淆矩阵。循环遍历每个测试图像,让SVM模型对图像进行分类(它应该选择五种可能中的一种)。在混淆矩阵的适当位置添加1。因此,如果图像应归类为3并且SVM将其归类为4,则应将1添加到3,4位...

答案 1 :(得分:1)

我想补充一些问题:

  1. 你提到:<<然后用它们各自的分类器测试这5个图像。即如果从第一类中取出5张图像,则对同一类别进行测试。 >>
  2. 你永远不应该知道测试图像的类(类别)。当然,您需要知道测试类别标签,以计算各种指标,如准确性,精度,混淆矩阵等。除此之外,当您使用SVM确定示例所属的类时,您必须尝试所有SVM

    有两种流行的培训和测试多类SVM的方法,即one-all-all和one-vs-one方法。阅读this回答及其相应问题,以便详细了解它们。

    我不知道MATLAB SVM是否能够进行多类分类,但如果使用LIBSVM,则它使用一对一方法。它也会正确地为您进行测试。但是,如果您想设计自己的一对一分类器,那么您应该如何继续:

    假设您有5个班级,然后训练所有可能的对组合= 5c2 = 10对({1,2},...,{1,5},{2,1},...,{2 ,5},...,{5,4})。在测试时,您必须应用所有10个模型并计算所有投票以确定最终结果。例如,我们训练模型为4对(比如说),({1 vs 2},{1 vs 3},{2 vs 1},{2 vs 3}),4个模型的输出为{1,1,分别为0,1}。这意味着,你的4个预测类是{1,1,1,2}。因此,最后一堂课是1。

    获得所有预测标签后,您实际上可以使用命令confusionmat来获取混淆矩阵。如果你想制作自己的,那么制作一个零5x5矩阵。在位置(实际标签,预测标签)上添加1,即如果实际类为2并且您将其预测为3,则在矩阵中的位置(2nd row, 3rd col)处添加1。