4

我知道什么是混淆矩阵。

给定 N 个类,我们有一个 NxN 矩阵 M 其中 - 每行是类之一 - 每列是类之一

M(X,Y) = 已归入 X 类并应归入 Y 类的元素数(当然,如果 X=Y,则分类正确)。

现在我有一组“复合类”和可变数量的类

  • “复合”是指一个类对应于一个向量(可变长度)。例如,如果类由 2 元素向量表示,则可能的类将是:

    [0,0]

    [0,1]

    [1,0]

    [1,1]

我的目标是定义一个函数:

  • 输入:分类元素的 NxM 矩阵(其中 N=分类元素的数量,M=每个类别的元素数量),每个元素的预期类别的 NxM 矩阵。
  • OUTPUT:输入类对应的NXN混淆矩阵

输出示例:

[1 0 0]
[0 2 0]
[0 1 0]

这个矩阵是 3x3 矩阵。

这意味着总类数为 3,分类元素数为 4:

  • 一个元素本应归为第 1 类,并已归为第 1 类
  • 两个元素应该被归入第 2 类并且已经被归为第 2 类
  • 一种元素应归为第 3 类,并已归为第 2 类

(元素是如何组成的并不重要。让我们想象一下这些类可能是:

[0,0,1]
[1,0,1]
[1,1,1]

** 输入矩阵示例(预期类):**

[0,0,1]
[1,0,1]
[1,0,1]
[1,1,1]

** 输入矩阵示例(获得类):**

[0,0,1]
[1,0,1]
[1,0,1]
[1,0,1]   <-- this is the element(line) incorrectly classified

我应该怎么做?(分类由 Perceptron 或 Adaline 神经网络进行)

提前感谢您的任何提示!

4

1 回答 1

4

关键是按以下形式使用ismember[Lia,Locb] = ismember(A,B,'rows') : 第二个输出参数告诉您矩阵 A 的每一行与矩阵 B 的哪一行匹配。使用此信息构建混淆矩阵(这是统计工具箱中的内置函数)。

classes = [0 0 1;
            1 0 1; 
            1 1 1];
 expected = [0 0 1;
             1 0 1;
             1 0 1;
             1 1 1];
 obtained = [0 0 1;
             1 0 1;
             1 0 1;
             1 0 1];    
>> [~, ex] = ismember(expected, classes,'rows')    
ex =    
     1
     2
     2
     3

>> [~, ob] = ismember(obtained, classes,'rows')    
ob =

     1
     2
     2
     2

>> confusionmat(ex,ob,'order',[1 2 3])    
ans =

     1     0     0
     0     2     0
     0     1     0

如果您没有访问权限confusionmat,您可以使用accummarray自己来完成。

num_observations = length(ex);
num_classes = size(classes,1);
accumarray([ex,ob],ones(num_observations,1),[num_classes,num_classes])
于 2012-06-26T17:32:22.300 回答