【问题标题】:Is my implementation of confusion matrix correct? Or is something else at fault here?我的混淆矩阵的实现是否正确?还是这里有其他问题?
【发布时间】:2014-10-13 01:22:18
【问题描述】:

我已经训练了一个有 5 个类的多类 svm 分类器,即svm(1)...svm(5).

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

然后使用它们各自的分类器测试这 5 张图像。即,如果从第一类中拍摄 5 张图像,则它们将针对同一类进行测试。

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

预测生成一个 5 x 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 的方式或我选择的功能。

【问题讨论】:

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


    【解决方案1】:

    我想补充一些问题:

    1. 您提到:>

    您永远不应该知道测试图像的类别(类别)。当然,您需要知道用于计算各种指标的测试类别标签,例如准确度、精度、混淆矩阵等。除此之外,当您使用 SVM 来确定示例属于哪个类时,您必须尝试所有 SVM .

    有两种流行的训练和测试多类 SVM 的方法,即一对多和一对一的方法。阅读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。

    【讨论】:

      【解决方案2】:

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

      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 位置...

      【讨论】:

        猜你喜欢
        • 2019-11-23
        • 2020-07-12
        • 1970-01-01
        • 2021-10-07
        • 2017-10-17
        • 2012-10-14
        • 2020-08-30
        • 1970-01-01
        • 2022-01-25
        相关资源
        最近更新 更多