簡單理解混淆矩陣—Matlab詳細程式碼註解
本人計算機小白一枚,將自己學到的知識點整理出來,一方面是對自己學習的小總結,另一方面是歡迎大家批評指正。如果覺得寫得還可以,大家可以轉發關注此部落格,謝謝!後續會有新演算法持續更新~.
一.混淆矩陣
(一).簡介
在人工智慧中,混淆矩陣(confusion matrix)是視覺化工具,特別用於監督學習,在無監督學習一般叫做匹配矩陣。在影象精度評價中,主要用於比較分類結果和實際測得值,可以把分類結果的精度顯示在一個混淆矩陣裡面。混淆矩陣是通過將每個實測像元的位置和分類與分類影象中的相應位置和分類像比較計算的。
混淆矩陣(confusion matrix)刻畫一個分類器的分類準確程度。“混淆”一詞也形象地表達了分類器面對多個分類時可能造成的混淆。
(二).混淆矩陣(Confusion Matrix)舉例說明
混淆矩陣的每一列代表了預測類別,每一列的總數表示預測為該類別的資料的數目;每一行代表了資料的真實歸屬類別,每一行的資料總數表示該類別的資料例項的數目。每一列中的數值表示真實資料被預測為該類的數目:如下圖,第一行第一列中的43表示有43個實際歸屬第一類的例項被預測為第一類,同理,第二行第一列的2表示有2個實際歸屬為第二類的例項被錯誤預測為第一類。
舉例如下:
如有150個樣本資料,這些資料分成3類,每類50個。分類結束後得到的混淆矩陣為:
每一行之和為50,表示50個樣本;
第一行說明類1的50個樣本有43個分類正確,5個錯分為類2,2個錯分為類3。
二.混淆矩陣的MATLAB實現
(一).資料集如下:
(二).MATLAB實現
1.confusion_matrix1.m檔案(在下面主函式中直接呼叫)
%==========================================================
function confusion_matrix1(act1,det1)
[mat,order] = confusionmat(act1,det1);
k=max(order); %k為分類的個數
%也可作實驗,自己隨機產生矩陣
%mat = rand(5); %# A 5-by-5 matrix of random values from 0 to 1
%mat(3,3) = 0; %# To illustrate
%mat(5,2) = 0; %# To illustrate
imagesc(mat); %# Create a colored plot of the matrix values
colormap(flipud(gray)); %# Change the colormap to gray (so higher values are
%#black and lower values are white)
title('不分性別的分開預測標籤與真實標籤的混淆矩陣');
textStrings = num2str(mat(:),'%0.02f'); %# Create strings from the matrix values
textStrings = strtrim(cellstr(textStrings)); %# Remove any space padding
%% ## New code: ###這裡是不顯示小矩陣塊裡的0,用空白代替
% idx = strcmp(textStrings(:), '0.00');
% textStrings(idx) = {' '};
%% ################
%# Create x and y coordinates for the strings %meshgrid是MATLAB中用於生成網格取樣點的函式
[x,y] = meshgrid(1:k);
hStrings=text(x(:),y(:),textStrings(:),'HorizontalAlignment','center');
midValue = mean(get(gca,'CLim')); %# Get the middle value of the color range
textColors = repmat(mat(:) > midValue,1,3); %# Choose white or black for the
%# text color of the strings so
%# they can be easily seen over
%# the background color
%將矩陣[mat(:) >midValue]複製1X3塊的向量(顏色值必須為包含3個元素的數值向量),即把矩陣[mat(:) > midValue]作為矩陣textColors的元素。
set(hStrings,{'Color'},num2cell(textColors,2)); %# Change the text colors;
%num2cell(textColors, 2)中2 代表「直行被切割」將結構陣列轉換成異質陣列 將結構陣列轉換成異質陣列;
%然後set去重後放在hStrings;
%下面這個數字8可根據自己的分類需求進行更改
set(gca,'XTick',1:8,...
'XTickLabel',{'1','2','3','4','5','6','7',8'},... %# and tick labels
'YTick',1:8,... %同上
'YTickLabel',{'1','2','3','4','5','6','7',8'},...
'TickLength',[0 0]);
%==========================================================
2.主函式main.m
a=xlsread('confusion_test.xls');
%========================================
%真實標籤:
act=a(1:194,2:2);
act1=act';
%性別為男生的分開預測的標籤
det=a(1:194,1:1);
det1=det';
%性別為男生的未分開預測的標籤
dett=a(1:194,3:3);
dett1=dett';
%這裡呼叫confusion_matrix1()函式求的是‘性別為男生的分開預測的標籤與真真實標籤的混淆矩陣’
confusion_matrix1(act1,det1)
%==========================================================
注意:上述程式只需要在confusion_matrix1.m檔案中將含有(act1,det1)的引數改成自己需要求的引數,然後在主程式中呼叫此函式就OK了!(程式碼可複製直接執行)
3.執行結果: