2015-10-28 2 views
3

Мне нужно написать код, который сравнивает два вектора - один, содержащий опорные значения, а другой - полученные значения после некоторого процесса классификации - того же размера и приводит к доверительной матрице, которая показывает, какие элементы и сколько из них ошибочно классифицированы. Допустим, что векторы: 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] Как сделать это? БлагодаряСравните два вектора одинакового размера в MATLAB

+3

Какова формулировка для матрицы доверия? Как вы его вычисляете? – NKN

+0

Я все еще теряюсь в том, как рассчитывалась матрица доверия. – rayryeng

+0

Ничего. Я понял. Каждая пара значений 'ref/obt' представляет собой пару строк/столбцов, которая необходима для доступа к доверительной матрице. Каждый раз, когда вы видите эту пару строк/столбцов, вы подсчитываете счет, который отображается в этой матрице. В будущем, пожалуйста, объясните, как эта матрица рассчитывается в будущем. Это не наша работа, чтобы попытаться угадать или сделать вывод о том, что вы пытаетесь спросить. Мы помогаем вам решать проблемы, но для этого вам необходимо дать нам как можно больше, чтобы понять вашу проблему. – rayryeng

ответ

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).

+0

Я только что запустил код. Spot on ... – kkuilla

+0

Большое спасибо. Он работает отлично. но есть ли более простой способ сделать это? Я совершенно новый в MATLAB, и ваш код, к сожалению, как-то трудно понять. У меня такое чувство, что цикл цикла с «длиной» и «нахождением» будет работать, но я не могу понять это. – NewProg

+0

@NewProg Конечно, это можно сделать с помощью цикла, который легче понять для начинающих Matlab. Всегда ли ваши значения в форме 1, 2, 3, ...? –

2
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 

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

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

Проверить это как стартер http://es.mathworks.com/help/matlab/matlab_prog/vectorization.html

+0

Большое вам спасибо, кажется мне более понятным. – NewProg

2

Вы хотите confusion matrix. Использование Matlab's confusionmat funcion:

>> confusionmat(ref, obt) 
ans = 

    0  0  0  1 
    0  0  1  0 
    0  1  2  1 
    2  0  0  0 
+0

Стоит упомянуть, что 'confusionmat' является частью панели статистики и машинного обучения. – kkuilla

+0

Отлично! Но как можно знать о таких функциях в MATLAB? – NewProg

+0

@NewProg Используйте Google. – rayryeng

Смежные вопросы