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

4
我知道什么是混淆矩阵。
给定N个类,我们有一个NxN的矩阵M,其中 - 每一行代表一个类 - 每一列代表一个类
M(X,Y)=在类别X中被分类且应该被分类到类别Y中的元素数量(当然,如果X = Y,则分类是正确的)。
现在我有一组“复合类”和一个可变数量的类
- 用“复合”来表示一个类对应一个向量(长度可变)。 例如,如果该类由2个元素的向量表示,则可能的类如下: [0,0] [0,1] [1,0] [1,1]
我的目标是定义一个带有以下内容的函数:
- 输入:一个已分类元素的NxM矩阵(其中N = 分类元素的数量,M = 每个类的元素数量),每个元素的期望类别的NxM矩阵。 - 输出:与输入类相应的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

我该怎么做?(分类是通过感知器或Adaline神经网络实现的)
提前感谢您的任何提示!

请给出一个关于“复合类别”混淆矩阵的示例。 - tmpearce
例子的输入是什么? - tmpearce
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的权限,可以使用accumarray自己完成。

num_observations = length(ex);
num_classes = size(classes,1);
accumarray([ex,ob],ones(num_observations,1),[num_classes,num_classes])

谢谢你。如果“期望”的元素与“获得”的元素不同怎么办?例如:在“获得”的元素中存在一个不应该存在的类。 - dragonmnl
好的,最后一个问题:我应该如何计算“不存在/无效”的分类数量? - dragonmnl
那是你应该自己能够处理的事情。 - tmpearce
抱歉..我好像漏掉了什么。accumarray([ex,ob],ones(num_observations,1),[num_classes,num_classes])。这个混淆矩阵是"[ex,ob]"吗?嗯..也许我应该将它赋值给一个变量:对吧? - dragonmnl
cm = accumarray(...)混淆矩阵是accumarray的输出结果。 - tmpearce
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接