我应该如何在Matlab中实现混淆矩阵?

时间:2012-06-26 16:41:34

标签: matlab confusion-matrix

我知道什么是混淆矩阵。

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

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

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

  • 带有“COMPOUND”我的意思是一个类对应一个向量(变量长度)。 例如,如果类由2个元素向量表示,则可能的类将为:

    [0,0]

    [0,1]

    [1,0]

    [1,1]

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

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

OUTPUT示例:

[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]

**输入矩阵示例(EXPECTEDclasses):**

[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]   <-- this is the element(line) incorrectly classified

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

提前感谢您的任何提示!

1 个答案:

答案 0 :(得分: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])