2015-11-04 4 views
0

У меня есть некоторые тестовые данные и метки:MATLAB - генерировать матрицу путаницы с классификатором

testZ = [0.25, 0.29, 0.62, 0.27, 0.82, 1.18, 0.93, 0.54, 0.78, 0.31, 1.11, 1.08, 1.02]; 

testY = [1 1 1 1 1 2 2 2 2 2 2 2 2]; 

Я тогда сортировать их:

[sZ, ind] = sort(testZ); %%Sorts Z, and gets indexes of Z 
sY = testY(ind); %%Sorts Y by index 
[N, n] = size(testZ'); 

Это будет давать отсортированные данные Y. На каждом элементе отсортированных данных Y я хочу классифицировать каждую точку слева как имеющую тип 1, а все справа - класс 2; Затем это будет повторяться для каждой точки данных. Как я могу это сделать, и выяснить для каждого элемента переменные:

  • TP (правда, положительные) - элементы правильно помечены как 1
  • FP (ложноположительный) - элементы неправильно отмечены как 1
  • TN (истинная отрицательный) - элементы правильно отмечен как 2
  • FN (ложные) - элементы неправильно отмечен как 2

цель этого настолько, что я могу создать кривую ROC для классификатора как часть некоторых школ Я работаю.

+0

Когда вы говорите: «каждая точка слева», сколько очков это что? Такое же количество очков, что и 1s в 'testY'? – BillBokeey

+0

@BillBokeey В первой точке не должно быть элементов слева и 13 (количество элементов в sY) справа, тогда найдена матрица замешательства, то тот же процесс повторяется для остальных точек – hjalpmig

+0

Хорошо, i 'm сообщение ответа – BillBokeey

ответ

0

Вот код для построения ROC и нахождения АУК значения:

tot_op = testZ; 
targets = testY; 
th_vals= sort(tot_op); 

for i = 1:length(th_vals) 
    b_pred = (tot_op>=th_vals(i,1)); 
    TP = sum(b_pred == 1 & targets == 2); 
    FP = sum(b_pred == 1 & targets == 1); 
    TN = sum(b_pred == 0 & targets == 1); 
    FN = sum(b_pred == 0 & targets == 2); 
    sens(i) = TP/(TP+FN); 
    spec(i) = TN/(TN+FP); 
end 


figure(2); 
cspec = 1-spec; 
cspec = cspec(end:-1:1); 
sens = sens(end:-1:1); 
plot(cspec,sens,'k'); 

AUC = sum(0.5*(sens(2:end)+sens(1:end-1)).*(cspec(2:end) - cspec(1:end-1))); 
fprintf('\nAUC: %g \n',AUC); 

Приведенный выше код является модифицированная версия, приведенная на http://www.dcs.gla.ac.uk/~srogers/firstcourseml/matlab/chapter5/svmroc.html

0

Вы можете перемещаться по точкам, а затем использовать логические индексирования и логические операторы типа, чтобы получить большую часть того, что вы хотите.

for i = 1:length(sY) 
     classification = [ones(1,i-1) 2*ones(1,length(sy)-i+1)]; 
     isTruePositive = ((sY == classification) & (sY == 1)); 
     numberOfTruePositive = sum(isTruePositive); 
     % Similar for other cases. 

     % Use the result in the loop or store it somewhere - as written here 
     % variables are over-written each iteration in the loop. 
end 

я не запускаю это, так что вам может понадобиться некоторые хитрости, но это вы должны получить большую часть пути.

+0

Я считаю, что вы допустили ошибку в '2 * ones (i, length (sy))'. Разве это не было бы? 2 * (1, length (sy) -i + 1) '? Плюс 'numberOfTruePositive' будет переопределяться на каждой итерации, и вы должны использовать' ii' вместо 'i' для индексации вашего цикла – BillBokeey

+0

@BillBokeey Спасибо. Я отредактировал длину с помощью редактирования. Вы правы, что переменные в этом примере будут переписаны. Поскольку мы не знаем, что OP хочет сделать с результатом, я не пытался решить эту проблему для него. Очевидно, что он должен храниться где-то постоянным или использоваться где-то в цикле до следующей итерации. – Brick

+0

Привет, спасибо за ответ, я проверил это завтра и посмотрю, смогу ли я подгонять мои потребности и держать вас в курсе! – hjalpmig