Precision/Recall和ROC曲线原理以及Matlab源码


查准率和查全率是信息检索效率评价的两个定量指标,不仅可以用来评价每次检索的准确性和全面性,也是在信息检索系统评价中衡量系统检索性能的重要方面。

查准率(Precision ratio,简称为P),是指检出的相关文献数占检出文献总数的百分比。查准率反映检索准确性,其补数就是误检率。

查全率(Recall ratio,简称为R),是指检出的相关文献数占系统中相关文献总数的百分比。查全率反映检索全面性,其补数就是漏检率。

查全率=(检索出的相关信息量/系统中的相关信息总量)*100%

查准率=(检索出的相关信息量/检索出的信息总量)*100%

前者是衡量检索系统和检索者检出相关信息的能力,后者是衡量检索系统和检索者拒绝非相关信息的能力。两者合起来,即表示检索效率。

利用查准率和查全率指标,可以对每一次检索进行检索效率的评价,为检索的改进调整提供依据。利用这两个量化指标,也可以对信息检索系统的性能水平进行评价。要评价信息检索系统的性能水平,就必须在一个检索系统中进行多次检索。每进行一次检索,都计算其查准率和查全率,并以此作为坐标值,在平面坐标图上标示出来。通过大量的检索,就可以得到检索系统的性能曲线。实验证明,在查全率和查准率之间存在着相反的相互依赖关系--如果提高输出的查全率,就会降低其查准率,反之亦然。

网上源码有很多,这里找到了一个是Stefan Schroedl写的,跟大家分享一下:

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
function [prec, tpr, fpr, thresh] = prec_rec(score, target, varargin)
% PREC_REC - Compute and plot precision/recall and ROC curves.
%
%   PREC_REC(SCORE,TARGET), where SCORE and TARGET are equal-sized vectors,
%   and TARGET is binary, plots the corresponding precision-recall graph
%   and the ROC curve.
%
%   Several options of the form PREC_REC(...,'OPTION_NAME', OPTION_VALUE)
%   can be used to modify the default behavior.
%      - 'instanceCount': Usually it is assumed that one line in the input
%                         data corresponds to a single sample. However, it
%                         might be the case that there are a total of N
%                         instances with the same SCORE, out of which
%                         TARGET are classified as positive, and (N -
%                         TARGET) are classified as negative. Instead of
%                         using repeated samples with the same SCORE, we
%                         can summarize these observations by means of this
%                         option. Thus it requires a vector of the same
%                         size as TARGET.
%      - 'numThresh'    : Specify the (maximum) number of score intervals.
%                         Generally, splits are made such that each
%                         interval contains about the same number of sample
%                         lines.
%      - 'holdFigure'   : [0,1] draw into the current figure, instead of
%                         creating a new one.
%      - 'style'        : Style specification for plot command.
%      - 'plotROC'      : [0,1] Explicitly specify if ROC curve should be
%                         plotted.
%      - 'plotPR'       : [0,1] Explicitly specify if precision-recall curve
%                         should be plotted.
%      - 'plotBaseline' : [0,1] Plot a baseline of the random classifier.
%
%   By default, when output arguments are specified, as in
%         [PREC, TPR, FPR, THRESH] = PREC_REC(...),
%   no plot is generated. The arguments are the score thresholds, along
%   with the respective precisions, true-positive, and false-positive
%   rates.
%
%   Example:
%
% x1 = rand(1000, 1);
% y1 = round(x1 + 0.5*(rand(1000,1) - 0.5));
% prec_rec(x1, y1);
% x2 = rand(1000,1);
% y2 = round(x2 + 0.75 * (rand(1000,1)-0.5));
% prec_rec(x2, y2, 'holdFigure', 1);
% legend('baseline','x1/y1','x2/y2','Location','SouthEast');
 
% Copyright @ 9/22/2010 Stefan Schroedl
% Updated     3/16/2010
 
optargin = size(varargin, 2);
stdargin = nargin - optargin;
 
if stdargin < 2
  error( 'at least 2 arguments required' );
end
 
% parse optional arguments
num_thresh = -1;
hold_fig = 0;
plot_roc = (nargout <= 0);
plot_pr  = (nargout <= 0);
instance_count = -1;
style = '' ;
plot_baseline = 1;
 
i = 1;
while (i <= optargin)
  if (strcmp(varargin{i}, 'numThresh' ))
  if (i >= optargin)
  error( 'argument required for %s' , varargin{i});
  else
  num_thresh = varargin{i+1};
  i = i + 2;
  end
  elseif (strcmp(varargin{i}, 'style' ))
  if (i >= optargin)
  error( 'argument required for %s' , varargin{i});
  else
  style = varargin{i+1};
  i = i + 2;
  end
  elseif (strcmp(varargin{i}, 'instanceCount' ))
  if (i >= optargin)
  error( 'argument required for %s' , varargin{i});
  else
  instance_count = varargin{i+1};
  i = i + 2;
  end
  elseif (strcmp(varargin{i}, 'holdFigure' ))
  if (i >= optargin)
  error( 'argument required for %s' , varargin{i});
  else
  if ~isempty(get(0, 'CurrentFigure' ))
  hold_fig = varargin{i+1};
  end
  i = i + 2;
  end
  elseif (strcmp(varargin{i}, 'plotROC' ))
  if (i >= optargin)
  error( 'argument required for %s' , varargin{i});
  else
  plot_roc = varargin{i+1};
  i = i + 2;
  end
  elseif (strcmp(varargin{i}, 'plotPR' ))
  if (i >= optargin)
  error( 'argument required for %s' , varargin{i});
  else
  plot_pr = varargin{i+1};
  i = i + 2;
  end
  elseif (strcmp(varargin{i}, 'plotBaseline' ))
  if (i >= optargin)
  error( 'argument required for %s' , varargin{i});
  else
  plot_baseline = varargin{i+1};
  i = i + 2;
  end
  elseif (~ischar(varargin{i}))
  error( 'only two numeric arguments required' );
  else
  error( 'unknown option: %s' , varargin{i});
  end
end
 
[nx,ny]=size(score);
 
if (nx~=1 && ny~=1)
  error( 'first argument must be a vector' );
end
 
[mx,my]=size(target);
if (mx~=1 && my~=1)
  error( 'second argument must be a vector' );
end
 
score  =  score(:);
target = target(:);
 
if (length(target) ~= length(score))
  error( 'score and target must have same length' );
end
 
if (instance_count == -1)
  % set default for total instances
  instance_count = ones(length(score),1);
  target = max(min(target(:),1),0); % ensure binary target
else
  if numel(instance_count)==1
  % scalar
  instance_count = instance_count * ones(length(target), 1);
  end
  [px,py] = size(instance_count);
  if (px~=1 && py~=1)
  error( 'instance count must be a vector' );
  end
  instance_count = instance_count(:);
  if (length(target) ~= length(instance_count))
  error( 'instance count must have same length as target' );
  end
  target = min(instance_count, target);
end
 
if num_thresh < 0
  % set default for number of thresholds
  score_uniq = unique(score);
  num_thresh = min(length(score_uniq), 100);
end
 
qvals = (1:(num_thresh-1))/num_thresh;
thresh = [min(score) quantile(score,qvals)];
% remove identical bins
thresh = sort(unique(thresh),2, 'descend' );
total_target = sum(target);
total_neg = sum(instance_count - target);
 
prec = zeros(length(thresh),1);
tpr  = zeros(length(thresh),1);
fpr  = zeros(length(thresh),1);
for i = 1:length(thresh)
  idx     = (score >= thresh(i));
  fpr(i)  = sum(instance_count(idx) - target(idx));
  tpr(i)  = sum(target(idx)) / total_target;
  prec(i) = sum(target(idx)) / sum(instance_count(idx));
end
fpr = fpr / total_neg;
 
if (plot_pr || plot_roc)
 
  % draw
 
  if (~hold_fig)
  figure
  if (plot_pr)
  if (plot_roc)
  subplot(1,2,1);
  end
 
  if (plot_baseline)
  target_ratio = total_target / (total_target + total_neg);
  plot([0 1], [target_ratio target_ratio], 'k' );
  end
 
  hold on
  hold all
 
  plot([0; tpr], [1 ; prec], style); % add pseudo point to complete curve
 
  xlabel( 'recall' );
  ylabel( 'precision' );
  title( 'precision-recall graph' );
  end
  if (plot_roc)
  if (plot_pr)
  subplot(1,2,2);
  end
 
  if (plot_baseline)
  plot([0 1], [0 1], 'k' );
  end
 
  hold on;
  hold all;
 
  plot([0; fpr], [0; tpr], style); % add pseudo point to complete curve
 
  xlabel( 'false positive rate' );
  ylabel( 'true positive rate' );
  title( 'roc curve' );
  %axis([0 1 0 1]);
  if (plot_roc && plot_pr)
  % double the width
  rect = get(gcf, 'pos' );
  rect(3) = 2 * rect(3);
  set(gcf, 'pos' ,rect);
  end
  end
 
  else
  if (plot_pr)
  if (plot_roc)
  subplot(1,2,1);
  end
  plot([0; tpr],[1 ; prec], style); % add pseudo point to complete curve
  end
 
  if (plot_roc)
  if (plot_pr)
  subplot(1,2,2);
  end
  plot([0; fpr], [0; tpr], style);
  end
  end
end
1 2/3维图像分割工具箱 2 PSORT粒子群优化工具箱 3 matlab计量工具箱Lesage 4 MatCont7p1 5 matlab模糊逻辑工具箱函数 6 医学图像处理工具箱 7 人工蜂群工具箱 8 MPT3安装包 9 drEEM toolbox 10 DOMFluor Toolbox v1.7 11 Matlab数学建模工具箱 12 马尔可夫决策过程(MDP)工具箱MDPtoolbox 13 国立SVM工具箱 14 模式识别与机器学习工具箱 15 ttsbox1.1语音合成工具箱 16 分数阶傅里叶变换的程序FRFT 17 魔方模拟器与规划求解 18 隐马尔可夫模型工具箱 HMM 19 图理论工具箱GrTheory 20 自由曲线拟合工具箱ezyfit 21 分形维数计算工具箱FracLab 2.2 22 For-Each 23 PlotPub 24 Sheffield大学最新遗传算法工具箱 25 Camera Calibration 像机标定工具箱 26 Qhull(二维三维三角分解、泰森图)凸包工具箱 2019版 27 jplv7 28 MatlabFns 29 张量工具箱Tensor Toolbox 30 海洋要素计算工具箱seawater 31 地图工具箱m_map 32 othercolor配色工具包 33 Matlab数学建模工具箱 34 元胞自动机 35 量子波函数演示工具箱 36 图像局域特征匹配工具箱 37 图像分割graphcut工具箱 38 NSGA-II工具箱 39 chinamap中国地图数据工具箱(大陆地区) 40 2D GaussFit高斯拟合工具箱 41 dijkstra最小成本路径算法 42 多维数据快速矩阵乘法 43 约束粒子群优化算法 44 脑MRI肿瘤的检测与分类 45 Matlab数值分析算法程序 46 matlab车牌识别完整程序 47 机器人工具箱robot-10.3.1 48 cvx凸优化处理工具箱 49 hctsa时间序列分析工具箱 50 神经科学工具箱Psychtoolbox-3-PTB 51 地震数据处理工具CREWES1990版 52 经济最优化工具箱CompEcon 53 基于约束的重构分析工具箱Cobratoolbox 54 Schwarz-Christoffel Toolbox 55 Gibbs-SeaWater (GSW)海洋学工具箱 56 光声仿真工具箱K-Wave-toolbox-1.2.1 57 语音处理工具箱Sap-Voicebox 58 贝叶斯网工具箱Bayes Net Toolbox(BNT) 59 计算机视觉工具箱VFfeat-0.9.21 60 全向相机校准工具箱OCamCalib_v3.0 61 心理物理学数据分析工具箱Palamedes1_10_3 62 生理学研究工具箱EEGLAB 63 磁共振成像处理工具箱CONN 18b 64 matlab 复杂网络工具箱 65 聚类分析工具箱FuzzyClusteringToolbox 66 遗传规划matlab工具箱 67 粒子群优化工具箱 68 数字图像处理工具箱DIPUM Toolbax V1.1.3 69 遗传算法工具箱 70 鱼群算法工具箱OptimizedAFSAr 71 蚁群算法工具箱 72 matlab优化工具箱 73 数据包络分析工具箱 74 图像分割质量评估工具包 75 相关向量机工具箱 76 音频处理工具箱 77 nurbs工具箱 78 Nurbs-surface工具箱 79 grabit数据提取工具箱 80 量子信息工具箱QLib 81 DYNAMO工具箱 82 NEDC循环的整车油耗量 83 PlotHub工具箱 84 MvCAT_Ver02.01 85 Regularization Tools Version 4.1 86 MatrixVB 4.5(含注册) 87 空间几何工具箱 matGeom-1.2.2 88 大数计算工具箱 VariablePrecisionIntegers 89 晶体织构分析工具包 mtex-5.7.0 90 Minimal Paths 2工具箱 91 Matlab数学建模工具箱
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值