现在的位置: 首页 > 综合 > 正文

模式识别 评价方法 ROC曲线, DET曲线, FPPW, FPPI etc.

2018年10月28日 ⁄ 综合 ⁄ 共 4467字 ⁄ 字号 评论关闭

模式识别 评价方法 

ROC曲线 DET曲线  FPPW  FPPI

[URL=http://info.flagcounter.com/rRMC][IMG]http://s01.flagcounter.com/count2/rRMC/bg_FFFFFF/txt_000000/border_CCCCCC/columns_2/maxflags_10/viewers_0/labels_0/pageviews_0/flags_0/percent_0/[/IMG][/URL]

因个人在做模式识别相关的工作,模式识别算法最终的性能评价是关键。但苦于网上很难找到具体、详细的评价流程、方法以及代码,所以本人打算近期准备如题所示评价方法的整理工作,到时候会奉上方法介绍、基础代码(matlab 版),以帮助更多像我这样对这些方法有些迷茫的人。

暂时提供matlab中自带的ROC,DET曲线绘制函数: perfcurve()

具体使用方法,中文链接:http://ilovematlab.cn/thread-76781-1-1.html

MathWork Manual(文档源自matlab2013。之前低版本中应该有该函数,但本人在自己的2008a版本中没有发现,2010版本中应该有): http://www.mathworks.cn/cn/help/stats/perfcurve.html

自编 ROC 曲线及相关中间结果的计算代码。

Main function:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%function: ROC curve related
%   date : 2013.07.01
% author : Xin Yang, School of medicine, SZU
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 根据Label8score文件绘制 ROC、DET曲线
% 获取数据文件路径
[filename, pathname] = uigetfile( {'*.txt', 'Model Files (*.txt)'; ...
'*.*', 'All Files (*.*)'}, '选择 ROC 数据源','F:\Result\FPPW\');
if isequal(filename,0) || isequal(pathname,0)
    return;%如果点了“取消”
else
    L8S_file = [pathname , filename];
end
dot_num = 50;
YX_Roc(L8S_file , dot_num);
% YX_DET_Curve(L8S_file , dot_num);

YX_Roc function:

% 根据 标记&预测得分文件 绘制ROC曲线
function YX_Roc(Label8ScoreFile , dot_num)
% 加载 标记&预测得分 数据文件  1:正 0:负
Mat_L8S = load(Label8ScoreFile);
sample_num = size(Mat_L8S ,1);
% 绘制正、负标记分布趋势图,用于观察正负样本的交叉程度
Plot_PN_pdf(Mat_L8S);

Label = Mat_L8S(:,1);% 人工标记
Score = Mat_L8S(:,2);% 算法评分
% 分数上下限
Upper = max(Score);
Lower = min(Score);
% 拓宽分数上下限,便于达到极限
Upper = Upper + 0.1;
Lower = Lower - 0.1;
% 点数
bins = dot_num;
% 步进
step = (Upper - Lower)/bins;
% 阈值变化
T = Lower:step:Upper;
T_num = bins + 1;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 计算 TPR 、FPR
TPR = zeros(T_num ,1);
FPR = zeros(T_num ,1);
% 遍历阈值
for i = 1:T_num
    T_temp = T(i);
    TP = 0 ; FN = 0;% 清零
    FP = 0 ; TN = 0;
    % 遍历样本
    for j = 1:sample_num
        if (Label(j) == 1)
            if (Score(j) >= T_temp)
                TP = TP + 1;% 真阳
            else
                FN = FN + 1;% 假阴
            end
        elseif (Label(j) == 0)
            if (Score(j) >= T_temp)
                FP = FP + 1;% 假阳
            else
                TN = TN + 1;% 真阴
            end
        end
    end
    % *****
    TPR(i) = TP/(TP + FN);
    FPR(i) = FP/(FP + TN);
end
% ROC 曲线
figure
plot(FPR , TPR , 'c', 'LineWidth',2);
axis([0 ,1 ,0 ,1]);
xlabel('1-Specificity')
ylabel('Sensitivity')
title('ROC')
grid on
% Youden 指数
figure
X = TPR-FPR;
plot(X ,'r','LineWidth',2);
title('Youden 指数');
% TPR、FPR 随阈值的变化,便于观察、确定阈值
figure ,plot3(FPR , TPR , T ,'Color' , 'r' ,'LineWidth',2);
xlabel('\fontsize{14}\bfX轴 -- FPR')
ylabel('\fontsize{14}\bfY轴 -- TPR')
zlabel('\fontsize{14}\bfZ轴 -- Threshold')
title('\fontsize{14}\bf阈值选取')

Plot_PN_pdf function : 

% 根据 Label2Score 绘制正、负标记的概率密度函数曲线
function Plot_PN_pdf(Mat_label2score)

[La_P_r , La_P_c] = find(Mat_label2score(:,1) == 1);
[La_N_r , La_N_c] = find(Mat_label2score(:,1) == 0);

P_Score = Mat_label2score(La_P_r , 2);
N_Score = Mat_label2score(La_N_r , 2);

[P_Count , P_bin] = hist(P_Score , 50);
[N_Count , N_bin] = hist(N_Score , 50);
P_Count = (P_Count - min(P_Count))/(max(P_Count) - min(P_Count));
N_Count = (N_Count - min(N_Count))/(max(N_Count) - min(N_Count));

figure 
values = spcrv([[P_bin(1) P_bin P_bin(end)];[P_Count(1) P_Count P_Count(end)]],3);
plot(values(1,:),values(2,:),'Color' , 'r' ,'LineWidth',2);
hold on 
values = spcrv([[N_bin(1) N_bin N_bin(end)];[N_Count(1) N_Count N_Count(end)]],3);
plot(values(1,:),values(2,:),'Color' , 'b' ,'LineWidth',2);
legend('\fontsize{14}\it  P-Labeled','\fontsize{14}\it  N-Labeled')
xlabel('\fontsize{14}\bfScore')
ylabel('\fontsize{14}\bffrequency')
title('\fontsize{14}\bf正、负标记分布曲线')

中间结果:

  

                                    (1)                                                                                          (2)

  

                                  (3)                                                                                           (4)

(1)图刻画了正负测试数据的预测得分分布(概率密度函数),并表明了正负测试样本得分的交叉程度。交叉程度由两者曲线下的交叉部分的积分,即面积决定。交叉越多,则表明分类器效果越差,反之,效果越好。

(2)图则是ROC曲线,越靠近左上角,分类器性能越好。

(3)图则是ROC曲线应用时,选取实际应用阈值的参考方法之一:Youden指数。曲线最高点对应的阈值为最好的应用阈值。Youden指数可参考如下文章第6页:http://www.medicalbiostatistics.com/roccurve.pdf

(4)图是基于ROC,选取阈值的曲线。X, Y分别为假阳率、真阳率,Z轴则是相应的阈值。要始终记住的是,ROC曲线的产生,就是因为以阈值作为变量,在不同阈值下,得到的多组真阳、假阳率点绘制而来的ROC曲线。所以ROC曲线上的任何一个点,都是有对应的阈值的。绘制ROC曲线的目的,除了直观的看到分类器性能,另一个重要作用就是,根据ROC曲线,选取一个合理的阈值,用于实际检测、应用、判定。


另附两篇个人觉得很有用的博文链接,是关于ROC和Precision-Recall的讲解的:

[1]

http://www.zhizhihu.com/html/y2012/4076.html

[2] http://blog.csdn.net/abcjennifer/article/details/7834256

//=============== 28-Aug-2015 增加==================//

目标检测中另外常用的评价标准则是FPPW和FPPI,详细应用可以参考这篇文章:

Pedestrian detection: A benchmark


两者都侧重考察FP(False Positive)出现的频率。

FPPW (False Positive per Window)

基本含义:给定一定数目N的负样本图像,分类器将负样本判定为“正”的次数FP,其比率FP/N即为FPPW。意义与ROC中的假阳率相同。FPPW中,一张图就是一个样本。

FPPI (False Positive per Image)

基本含义:给定一定数目N的样本集,内含N张图像,每张图像内包含或不包含检测目标。

每张图像均需要标定:

1.包含目标的个数;

2. 目标的准确位置L。

而后在每张图像上运行分类器,检测目标并得到位置p。然后,检查每张图像内的检测结果是否“击中”标定的目标:

a. 若图像内无目标,而分类器给出了n个“目标”检测结果,那么False Positive 次数 +n;

b. 若图像内有目标,则判断p是否击中L,判断标准参看上述文章(主要看p与L的重叠率)。若判断未击中,则False Positive 次数 +1。

最后 FPPI = (False Positive 次数)/N。

FPPI 相比于FPPW来说,更接近于分类器的实际应用情况。


抱歉!评论已关闭.