给定两个矩阵matlab,计算出一个混淆矩阵

时间:2020-03-29 01:04:08

标签: matlab matrix octave confusion-matrix

我有两个Xval(预测值)和Sv(验证测试)矩阵,一个带有分类器输出数据,另一个带有相同样本的验证数据。每一列代表预测值,例如[0 0 1 0 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

1 个答案:

答案 0 :(得分: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
相关问题