Мне нужно написать код, который сравнивает два вектора - один содержит контрольные значения, а другой - значения, полученные после некоторого процесса классификации - одинакового размера, и приводит к матрице достоверности, которая показывает, какие элементы и сколько из них неправильно классифицированы . Допустим, векторы: ref = [3;3;3;4;4;2;1;3] и obt = [4;2;3;1;1;3;4;3] Я хочу, чтобы матрица достоверности была: [0 0 0 1; 0 0 1 0;0 1 2 1 ;2 0 0 0] Как это сделать? благодаря

3
NewProg 28 Окт 2015 в 13:53

3 ответа

Лучший ответ

Давайте воспользуемся accumarray и bsxfun:

  • Если возможные значения всегда имеют вид 1, 2, 3, ... :

    ref = [3;3;3;4;4;2;1;3]; %// original values
    obt = [4;2;3;1;1;3;4;3]; %// what the original values have been classified as
    
    vals = 1:max([ref(:) obt(:)]); %// all possible values
    result = accumarray([ref(:) obt(:)],1);
    
  • Если значения произвольны :

    obt = [.1 .1 5.4 5.4 3 2.2 2.2]; %// original values
    ref = [.1 2.2 2.2 5.4 5.4 3 3]; %// what the original values have been classified as
    
    vals = unique([ref(:);obt(:)]); %// all existing values
    [~, refv] = max(bsxfun(@eq, ref(:).', vals(:)));
    [~, obtv] = max(bsxfun(@eq, obt(:).', vals(:)));
    result = accumarray([refv(:) obtv(:)],1);
    

Входные векторы могут быть взаимозаменяемыми строками или столбцами.

vals содержит все возможные значения ([1 2 3 4] в вашем примере). result(m,n) указывает сколько раз значение vals(m) было классифицировано как vals(m) .

3
IKavanagh 28 Окт 2015 в 12:46

Вам нужна матрица путаницы. Используйте функцию Matlab confusionmat:

>> confusionmat(ref, obt)
ans =

     0     0     0     1
     0     0     1     0
     0     1     2     1
     2     0     0     0
2
Rafael Monteiro 28 Окт 2015 в 12:17
num_classes = max([ref;obt]);
mat_classes = zeros(num_classes);

for i = 1:length(ref)
    mat_classes(ref(i),obt(i)) = mat_classes(ref(i),obt(i))+1
end

Это должно делать то, что вы хотите, более простым способом.

Это гораздо более неэффективно, чем ответ Луиса Мендо. Циклы for в Matlab обычно не являются хорошей идеей. Если вы планируете часто использовать Matlab, вам следует использовать векторизацию.

Отметьте это как начальный http://es.mathworks.com/help/matlab/ matlab_prog / vectorization.html

2
luismf 28 Окт 2015 в 11:23