Calculate a confusion matrix given two matrix matlab

I have two Xval(Predicted values) and Sv(validation test) matrices, one with the classifier output data and the other with the validation data for the same samples. Each column represents the predicted value, eg [0 0 1 0 0 0 0 0 0 0] represents digit 3 (1 in the digit that is). I would like to know if it is possible to calculate the confusion matrix in a vectorized way or with a built in function, the sizes of both matrices are 12000x10. The code who generates both matrices are this

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

Upvotes: 1

Views: 398

Answers (1)

Max
Max

Reputation: 4045

There are build-in functions confusionmat or plotconfusion. But if you want to have full control, you can just write a simple function yourself, e.g:

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

Upvotes: 1

Related Questions