matlab - 我的混淆矩阵的实现正确吗?或者这里还有其他问题吗?

标签 matlab machine-learning classification svm feature-extraction

我训练了一个包含 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 的方式或我选择的功能。

最佳答案

我想补充一些问题:

  1. 您提到:<< 然后使用各自的分类器对这 5 张图像进行测试。即,如果从第一类中获取 5 张图像,则将针对同一类对它们进行测试。 >>

您永远不应该知道测试图像的类别(类别)。当然,您需要知道用于计算各种指标(例如准确度、精度、混淆矩阵等)的测试类别标签。除此之外,当您使用 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,则在矩阵中的位置 (第 2 行,第 3 列) 添加 1 .

关于matlab - 我的混淆矩阵的实现正确吗?或者这里还有其他问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25391947/

相关文章:

python - Matlab 过滤器与 Python lfilter 不兼容

matlab - 查找正向过零和负向过零

c++ - 在 Matlab 中加载 .dll 导致 'type not found' 问题

python - scikit-learn 中的线性回归

machine-learning - Caffe sigmoid交叉熵损失

deep-learning - 如何选择用于我的模型的预训练权重?

r - eval 中的错误(predvars、数据、env): object 'Rm' not found

matlab - 按指定顺序创建 1 的数组

Python - sklearn 管道 SVC f_regression - 获取列名称

machine-learning - 如何使用有限的数据集为科学文本生成标签?