Confusion Matrix

论文中咱们会经常看见一类图,比如说多类别文类问题,那么每一个类别分到其他类别都有一些数据,但是分到自己类别的毕竟多,这样计算百分比之后就形成了一个矩阵,如果分类正确率高的话,那么对角线上的元素的值,也就是自己到自己的那一部分,value就大。

我最近也在做多分类问题,要画这样的图,但是发现确实很少有代码,自己画的确实不好看,还牵扯到值的显示和x轴标签的旋转问题,所以一直自己也没空仔细研究,就去stackoverflow问了一下,马上就得到了答案,stackoverflow是个好站点啊,关于计算机领域等的问答系统。很多牛人在上面。

下面我整理了一下代码,用的答案是gnovice的,分享出来,加入函数的输入就是一个矩阵了

  
  
 
function de draw_cm(mat,tick)>
%%
%  参数:mat-矩阵;tick-要在坐标轴上显示的label向量,例如{'label_1','label_2'...}
%
%%
imagesc(mat);            %# 绘彩色图
colormap(flipud(gray));   de> de>%# 转成灰度图,因此高value是渐黑色的,低value是渐白的
num_class=size(mat,1);
 
textStrings = num2str(mat(:),'%0.2f');
textStrings = strtrim(cellstr(textStrings));
[x,y] = meshgrid(1:num_class);
hStrings = text(x(:),y(:),textStrings(:), 'HorizontalAlignment','center');
midValue = mean(get(gca,'CLim'));
textColors = repmat(mat(:) > midValue,1,3);
%改变test的颜色,在黑cell里显示白色 de>
set(hStrings,{'Color'},num2cell(textColors,2));   de> de>%# Change the text colors de>
 
set(gca,'xticklabel',tick,'XAxisLocation','top');
rotateXLabels(gca, 45 );
 
dset(gca,'yticklabel',tick);
对照用:
Confusion Matrix - 妹妹妹妹妹妹妹儿的~ - 这孩子谁懂的博客
 
 
 
 

里面的代码rotateXLabels(gca, 45 );是用来对x轴的label进行旋转的,防止因为太长而重叠,用的是Ben Tordoff写的,自己可以去下载这个function,这里我就不列出来了。

举个例子吧:

  
  
clc;
clear;
figure(1);
mat = rand(6);
draw_cm(mat,{'label_1','label_2','label_3', 'label_4', 'label_5', 'label_6'});
Confusion Matrix - 妹妹妹妹妹妹妹儿的~ - 这孩子谁懂的博客

 

混淆矩阵分析指标

matlab计算得到的混淆矩阵:

预测结果\实际情况

低质

非低质

低质

   

非低质

   

为分析使用,转换得到的混淆矩阵:

 

低质

非低质

判断正确

[TP]

[TN]

判断错误

[FP]

[FN]

程序识别错误的总数:

N = TN + FP 

程序识别正确的总数:

P = TP + FN 

正确识别为“低质”的站点占识别错误总数的比例(值越大越好):

TP Rate = TP/N 

未召回的“低质”站点占识别错误总数的比例:

FP Rate = FP/N  

特征系数--误判为“低质”的站点占识别错误总数的比例:

Specificity = TN/N 

召回率--正确识别为“低质”的站点占识别正确总数的比例:

Recall = TP/P

精密度--正确识别为“低质”的站点占“低质”站点总数的比例(值越大越好):

Precision = TP/(TP+FP)

准确率--模型判断为“低质”的站点占测试集总量的比例:

Accuracy = (TP+TN)/(P+N) 

MatLab计算混淆矩阵指标的函数

传入参数为单分类的 2 × 2 混淆矩阵,输出上一节所列举的各个指标的值。Matlab 函数:

  
  
function [] = confmatCal(confmat)
    TP = confmat(1,1);
    TN = confmat(1,2);
    FP = confmat(2,1);
    FN = confmat(2,2);
    N = TN + FP;
    P = TP + FN;

   
   
    fprintf('%s %d\n','TP =', TP);
    fprintf('%s %d\n','TN =', TN);
    fprintf('%s %d\n','FP =', FP);
    fprintf('%s %d\n\n','FN =', FN);
    fprintf('%s %d\n','N =', N);
    fprintf('%s %d\n\n','P =', P);
    
    fprintf('%s %d\n','TP_Rate =', TP/N);
    fprintf('%s %d\n','FP_Rate =', FP/N);
    fprintf('%s %d\n','Specificity =', TN/N);
    fprintf('%s %d\n','Recall =', TP/P);
    fprintf('%s %d\n','Precision =', TP/(TP+FP) );
    fprintf('%s %d\n\n','Accuracy =', (TP+TN)/(P+N) );

   
   
    fprintf('%s %d\n','g_mean1 =', sqrt(TP*P) );
    fprintf('%s %d\n','g_mean2 =', sqrt(TP*TN) );
end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值