ECG-Kit 1.0
(4,074 bytes)
%CONFMAT Construct confusion matrix
%
% [C,NE,LABLIST] = CONFMAT(LAB1,LAB2,METHOD,FID)
%
% INPUT
% LAB1 Set of labels
% LAB2 Set of labels
% METHOD 'count' (default) to count number of co-occurences in
% LAB1 and LAB2, 'disagreement' to count relative
% non-co-occurrence.
% FID Write text result to file
%
% OUTPUT
% C Confusion matrix
% NE Total number of errors (empty labels are neglected)
% LABLIST Unique labels in LAB1 and LAB2
%
% DESCRIPTION
% Constructs a confusion matrix C between two sets of labels LAB1
% (corresponding to the rows in C) and LAB2 (the columns in C). The order of
% the rows and columns is returned in LABLIST. NE is the total number of
% errors (sum of non-diagonal elements in C).
%
% When METHOD = 'count' (default), co-occurences in LAB1 and LAB2 are counted
% and returned in C. When METHOD = 'disagreement', the relative disagreement
% is returned in NE, and is split over all combinations of labels in C
% (such that the rows sum to 1). (The total disagreement for a class equals
% one minus the sensitivity for that class as computed by TESTC).
%
% [C,NE,LABLIST] = CONFMAT(D,METHOD)
%
% If D is a classification result D = A*W, the labels LAB1 and LAB2 are
% internally retrieved by CONFMAT before computing the confusion matrix.
%
% When no output argument is specified, or when FID is given, the
% confusion matrix is displayed or written a to a text file. It is assumed
% that LAB1 contains true labels and LAB2 stores estimated labels.
%
% EXAMPLE
% Typical use of CONFMAT is the comparison of true and and estimated labels
% of a testset A by application to a trained classifier W:
% LAB1 = GETLABELS(A); LAB2 = A*W*LABELD.
% More examples can be found in PREX_CONFMAT, PREX_MATCHLAB.
%
% SEE ALSO
% MAPPINGS, DATASETS, GETLABELS, LABELD
% Copyright: R.P.W. Duin, r.p.w.duin@prtools.org
% Faculty EWI, Delft University of Technology
% P.O. Box 5031, 2600 GA Delft, The Netherlands
% $Id: confmat.m,v 1.7 2008/10/14 21:34:32 duin Exp $
function [error_idx, error_type_idx, error_type_lablist] = classification_errors(arg1)
prtrace(mfilename);
% Check arguments.
if isdataset(arg1)
lab1 = getlabels(arg1);
lab2 = arg1*labeld;
else
error('A result dataset should be provided.');
end
% Renumber LAB1 and LAB2 and find number of unique labels.
m = size(lab1,1);
if (m~=size(lab2,1))
error('LAB1 and LAB2 have to have the same lengths.');
end
[nlab1,lablist1] = renumlab(lab1);
[nlab2,lablist2] = renumlab(lab2);
% n1 = max(nlab1);
% n2 = max(nlab2);
% n = max(n1,n2);
[nlab1,nlab2,lablist] = renumlab(lab1,lab2);
n = size(lablist,1);
n1 = size(lablist1, 1);
n2 = size(lablist2, 1);
% Construct matrix of co-occurences (confusion matrix).
idx_count = 1;
error_idx = [];
error_type_idx = [];
error_type_lablist = {};
length_lablist1 = size(lablist1,2);
length_lablist2 = size(lablist2,2);
lablist1 = char([ cellstr('No_label'); cellstr(lablist)]);
lablist2 = char([ cellstr('Reject'); cellstr(lablist)]);
C = zeros(n+1,n+1);
for i = 0:n
K = find(nlab1==i);
if (isempty(K))
%Clase no presente
C(i+1,:) = zeros(1,n+1);
else
for j = 0:n
aux_idx = find(nlab2(K)==j);
laux_idx = length(aux_idx);
C(i+1,j+1) = laux_idx;
% if(i>0 && j>0 && i~=j && laux_idx > 0)
if(i~=j && laux_idx > 0)
%es un error de un ejemplo etiquetado correctamente.
error_idx = [ error_idx; K(aux_idx(:))];
error_type_idx = [error_type_idx; repmat(idx_count, laux_idx,1)];
error_type_lablist{idx_count} = [lablist1(i+1,1:min(length_lablist1,4)) ' x ' lablist2(j+1,1:min(length_lablist2,4))];
idx_count = idx_count + 1;
end
end
end
end
error_type_lablist = char(error_type_lablist);
return