79 lines
1.7 KiB
Matlab
79 lines
1.7 KiB
Matlab
function [ConfMatClass ConfMatAll Accuracy Error] = confusion(TrueLabels, FoundLabels)
|
|
|
|
% function [ConfMatClass ConfMatAll Accuracy Error] =
|
|
% eegc3_confusion_matrix(TrueLabels, FoundLabels)
|
|
%
|
|
% Function to recover a confusion matric of classification problem given
|
|
% the groiund truth classes and the classes found by a classifier
|
|
%
|
|
% Inputs:
|
|
%
|
|
% TrueLabels: Ground truth data labels
|
|
%
|
|
% FoundLabels: Labels predicted by a classifier
|
|
%
|
|
% Outputs:
|
|
%
|
|
% ConfMatClass: Confusion Matrx ClassNum x ClassNum in percentages per
|
|
% class
|
|
%
|
|
% ConfMatAll: Confusion Matrx ClassNum x ClassNum in overall percentages
|
|
%
|
|
% Accuracy: Total accuracy % (diagonal of Confusion Matrix)
|
|
%
|
|
% Error: Total Error % (100 - Accuracy)
|
|
|
|
if(~isvector(TrueLabels) || ~isvector(FoundLabels))
|
|
disp('[eegc3_confusion_matrix] Labels must be vectors');
|
|
ConfMat = [];
|
|
Accuracy = [];
|
|
Error = [];
|
|
return;
|
|
end
|
|
|
|
N1 = length(TrueLabels);
|
|
N2 = length(FoundLabels);
|
|
|
|
if(N1 ~= N2)
|
|
disp('[confusion] True and predicted labels must be the same size');
|
|
ConfMat = [];
|
|
Accuracy = [];
|
|
Error = [];
|
|
return;
|
|
else
|
|
NSample = N1;
|
|
end
|
|
|
|
% Find number of classes
|
|
Classes = sort(unique(TrueLabels));
|
|
NClass = length(Classes);
|
|
|
|
if(~isequal(Classes,[1:NClass]) && ~isequal(Classes,[1:NClass]'))
|
|
disp('[confusion] Classes must be a vector [1:N] or [1:N]');
|
|
end
|
|
|
|
% Compute Confusion Matrix
|
|
|
|
ConfMat = zeros(NClass);
|
|
ConfMatAll = zeros(NClass);
|
|
for i=1:NSample
|
|
ConfMat(TrueLabels(i),FoundLabels(i)) = ...
|
|
ConfMat(TrueLabels(i),FoundLabels(i)) + 1;
|
|
end
|
|
|
|
ConfMatAll = 100*ConfMat/sum(ConfMat(:));
|
|
|
|
ConfMatClass = zeros(NClass);
|
|
for i=1:NClass
|
|
ConfMatClass(i,:) = 100*ConfMat(i,:)/sum(ConfMat(i,:));
|
|
end
|
|
|
|
Accuracy = trace(ConfMatAll);
|
|
|
|
Error = 100 - Accuracy;
|
|
|
|
|
|
|
|
|
|
|