2015-11-04 61 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

給予當你說:「每一個點的左邊」,多少分這是否代表? 'testY'中的點數是否等於1? – BillBokeey

+0

@BillBokeey第一個點應該沒有左側的元素和右側的13個元素(sY中的元素數量),然後找到混淆矩陣,然後對其餘點重複相同的過程 – hjalpmig

+0

好吧,我'm發佈了一個答案 – BillBokeey

回答

0

這裏是繪製ROC和尋找AUC值的代碼:

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,長度(sy)-i + 1)'嗎?加'numberOfTruePositive'將在每次迭代時被覆蓋,你應該使用'ii'而不是'i'來爲你的循環索引 – BillBokeey

+0

@BillBokeey謝謝。我通過編輯來確定長度。你說得對,這個例子中的變量將被覆蓋。既然我們不知道OP對結果的想法,我沒有試圖爲他解決這個問題。顯然,它需要存儲在某個地方,或者在下一次迭代之前在循環中的某處使用。 – Brick

+0

嗨,謝謝你的回答,我明天會測試一下,看看我是否能夠滿足我的需求並讓你發佈! – hjalpmig