【问题标题】:How to create an error function comparing two matrices?如何创建比较两个矩阵的误差函数?
【发布时间】:2019-11-18 12:23:39
【问题描述】:

我在 MATLAB 中有两个矩阵。每一个都在不同的位置填充10。我想比较每个元素:

  • 如果有 1 匹配,我希望它记录为 True Positive。
  • 如果有 0 匹配,我希望它记录为真阴性。
  • 如果一个人说1,另一个人说0,我想记录为假阳性。
  • 如果一个人说0,另一个人说1,我想记录为假阴性。

我试着比较两个矩阵:

idx = A == B

但是,这给了我一个简单的匹配,而不是告诉我什么时候有真阳性或阴性等。

有什么我可以使用的特定功能,或任何替代方法吗?

【问题讨论】:

    标签: matlab matrix compare


    【解决方案1】:

    您可以按规定的方式添加矩阵....

    a = [1 0 1 0
         1 1 0 0
         0 0 1 1];
    
    b = [1 0 0 0
         0 0 0 1
         0 0 1 0];
    
    C = a + 2*b; 
    % For pairs [a,b] we expect
    % [0,0]: C = 0, true negative
    % [1,0]: C = 1, false positive
    % [0,1]: C = 2, false negative
    % [1,1]: C = 3, true positive
    % C = 
    %   [ 3 0 1 0
    %     1 1 0 2
    %     0 0 3 1 ]
    

    如果您有统计和机器学习工具箱并且您只想要一个摘要,您可能只需要函数confusionmat

    来自文档:

    C = confusionmat(group,grouphat) 返回由groupgrouphat 中的已知组和预测组确定的混淆矩阵C。 [...]。 C 是一个方阵,其大小等于groupgrouphat 中不同元素的总数。 C(i,j) 是已知属于i 组但预测属于j 组的观察计数。

    例如:

    a = [1 0 1 0
         1 1 0 0
         0 0 1 1];
    
    b = [1 0 0 0
         0 0 0 1
         0 0 1 0];
    
    C = confusionmat( a(:), b(:) );
    % C = 
    %    [ 5    1
    %      4    2]
    % So for each pair [a,b], we have 5*[0,0], 2*[1,1], 4*[1,0], 1*[0,1]
    

    对于那些使用神经网络工具箱的人来说,类似的功能是confusion

    【讨论】:

      【解决方案2】:

      您可以只使用位运算符来产生四个不同的值:

      bitor(bitshift(uint8(b),1),uint8(a))
      

      生成一个数组

      0:真阴性
      1:假阴性(a 为真,b 为假)
      2:误报(a 为假但 b 为真)
      3:真阳性

      【讨论】:

      • 好主意,这可以通过简单的a + 2*b 来实现,参见here
      • 确实如此,但为了清晰起见,我喜欢将我的位操作明确地设为 uint8(或其他)。
      • 哦,我知道这正是你的答案:我没有注意到它是一样的,因为我不习惯在常规代数操作下“隐藏”bitops。
      • 我最初的答案只是使用混淆矩阵进行总结,在阅读了您的好建议后,我添加了代数选项,为 inspo +1!
      【解决方案3】:

      一种天真的方法是逐个比较四个比较:

      % Set up some artificial data
      ground_truth = randi(2, 5) - 1
      compare = randi(2, 5) - 1
      
      % Determine true positives, false positives, etc.
      tp = ground_truth & compare
      fp = ~ground_truth & compare
      tn = ~ground_truth & ~compare
      fn = ground_truth & ~compare
      

      输出:

      ground_truth =
         1   0   1   0   0
         0   1   1   0   1
         1   1   0   1   0
         0   1   0   1   1
         0   0   0   1   0
      
      compare =
         0   1   1   0   1
         0   1   1   1   0
         1   1   0   0   1
         1   1   1   0   0
         1   1   1   1   1
      
      tp =
        0  0  1  0  0
        0  1  1  0  0
        1  1  0  0  0
        0  1  0  0  0
        0  0  0  1  0
      
      fp =
        0  1  0  0  1
        0  0  0  1  0
        0  0  0  0  1
        1  0  1  0  0
        1  1  1  0  1
      
      tn =
        0  0  0  1  0
        1  0  0  0  0
        0  0  1  0  0
        0  0  0  0  0
        0  0  0  0  0
      
      fn =
        1  0  0  0  0
        0  0  0  0  1
        0  0  0  1  0
        0  0  0  1  1
        0  0  0  0  0
      

      这行得通,因为01(或任何正值)是truefalse 的替代表示。

      为了保持你的主代码干净,设置一个单独的函数,比如my_stats.m

      function [tp, fp, tn, fn] = my_stats(ground_truth, compare)
      
        % Determine true positives, false positives, etc.
        tp = ground_truth & compare;
        fp = ~ground_truth & compare;
        tn = ~ground_truth & ~compare;
        fn = ground_truth & ~compare;
      
      end
      

      并在您的主代码中调用它:

      % Set up some artificial data
      ground_truth = randi(2, 5) - 1
      compare = randi(2, 5) - 1
      
      [tp, fp, tn, fn] = my_stats(ground_truth, compare)
      

      希望有帮助!

      【讨论】:

        【解决方案4】:

        我发现我可以使用find方法并设置两个条件,然后只需找到每个变量中元素的编号

        
        TruePositive = length(find(A==B & A==1)) 
        TrueNegative = length(find(A==B & A==0)) 
        FalsePositive = length(find(A~=B & A==1))
        FalseNegative = length(find(A~=B & A==0))
        
        

        @Wolfie 建议的 confusionmatrix() 方法也非常简洁,尤其是如果您使用 confusionchart(),它提供了很好的可视化效果。

        【讨论】:

        • 使用nnz(A==B & A==1)sum(A==B & A==1)(或您的任何其他条件)通常比组合lengthfind 快得多,因为在这种情况下您不需要关心find 返回的索引,所以只需“计算那些”nnzsum 都会更简单。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-09
        • 1970-01-01
        • 2011-12-23
        • 1970-01-01
        • 1970-01-01
        • 2017-10-27
        • 1970-01-01
        相关资源
        最近更新 更多