混淆矩陣-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)
%==========================================================

 

注意:

           ctual:就是我們已知的label。

           detected是我們通過模型預測得到的label

           結合下面語句實現:

           [pred,acc,preb] = svmpredict(double(testLabel), testData, model, '-b 1');

          上述程序只需要在confusion_matrix1.m文件中將含有(act1,det1)的參數改成自己需要求的參數,然后在主程序中調用此函數就OK了!(代碼可復制直接運行)

3.運行結果:

這里寫圖片描述

參考文獻: 
[1].https://baike.baidu.com/item/%E6%B7%B7%E6%B7%86%E7%9F%A9%E9%98%B5/10087822?fr=aladdin 
[2].http://blog.csdn.net/songchaomail/article/details/43834741/ 
[3].http://blog.csdn.net/zhaomengszu/article/details/56283832


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM