【问题标题】:Calculate a confusion matrix given two matrix matlab给定两个矩阵matlab计算一个混淆矩阵
【发布时间】:2020-07-09 13:11:33
【问题描述】:

我有两个 Xval(预测值)和 Sv(验证测试)矩阵,一个带有分类器输出数据,另一个带有相同样本的验证数据。每列代表预测值,例如[0 0 1 0 0 0 0 0 0 0]代表数字3(即数字中的1)。我想知道是否可以以矢量化方式或使用内置函数计算混淆矩阵,两个矩阵的大小均为 12000x10。生成两个矩阵的代码是这样的

load data;
load test;
[N, m] = size(X);
X = [ones(N, 1) X];
[Nt, mt] = size(Xt);
Xt = [ones(Nt, 1) Xt];
new_order = randperm(N);
X = X(new_order,: );
S = S(new_order,: );
part = 0.8;
Xtr = X(1: (part * N),: );
Xv = X((part * N + 1): N,: );
Str = S(1: (part * N),: );
Sv = S((part * N + 1): N,: );
v_c = [];
v_tx_acerto = [];
tx_acerto_max = 0;
c =  250;
w = (X'*X+c*eye(m+1))\X' * S; 
Xval = Xv*w;
for i=1:12000
    aux = Xval(i,:);
    aux(aux == max(aux)) = 1;
    aux(aux<1) = 0;
    Xval(i,:) = aux;
end

【问题讨论】:

    标签: matlab matrix octave confusion-matrix


    【解决方案1】:

    有内置函数confusionmatplotconfusion。但是如果你想完全控制,你可以自己写一个简单的函数,例如:

    function [CMat_rel,CMat_abs] = ConfusionMatrix(Cprd,Cact)
    
    Cprd_uq = unique(Cprd);
    Cact_uq = unique(Cact);
    
    NumPrd = length(Cprd_uq);
    NumAct = length(Cact_uq);
    % assert(NumPrd == NumAct)
    
    % allocate memory
    CMat_abs = NaN(NumPrd,NumAct);
    CMat_rel = NaN(NumPrd,NumAct);
    for j = 1:NumAct
        lgAct = Cact == Cact_uq(j);
        SumAct = sum(lgAct);
        for i = 1:NumAct
            lgPrd = Cprd == Cact_uq(i);
    
            Num = sum( lgPrd(lgAct) == true );
            CMat_abs(i,j) = Num;
            CMat_rel(i,j) = Num/SumAct;
        end
    end
    end
    

    【讨论】:

    • 谢谢!但我想计算一个这样的矩阵,给定预测和真实的2个矩阵。 i.stack.imgur.com/jYlBa.jpg 像这样!以矢量化方式或使用一些内置函数,谢谢!
    • 这就是代码的作用(假设您预测向量)。否则,请查看我命名的内置函数 ;)
    猜你喜欢
    • 2018-04-01
    • 2012-01-20
    • 1970-01-01
    • 2017-02-25
    • 2020-05-19
    • 2015-07-31
    • 2020-05-17
    • 1970-01-01
    相关资源
    最近更新 更多