rocplot.m
来自「一个关于数据聚类和模式识别的程序,在生物化学,化学中因该都可以用到.希望对大家有」· M 代码 · 共 63 行
M
63 行
function [fn, fp]=rocPlot(data1, data2, scaleStr)
% rocPlot: Plot for receiver operating curve
% Usage: rocPlot(data1, data2)
% data1: vector for data of negative set
% data2: vector for data of positive set
% scaleStr: 'log' or 'linear'
%
% For example:
% data1=randn(1,300)-1;
% data2=randn(1,300)+1;
% subplot(1,2,1);
% rocPlot(data1, data2);
% subplot(1,2,2);
% rocPlot(data1, data2, 'log');
% Roger Jang, 20061025
if nargin<3, scaleStr='linear'; end
if nargin<1, selfdemo; return; end
num1=length(data1);
num2=length(data2);
allData=[data1(:); data2(:)]';
dataNum=num1+num2;
minValue=min(allData);
maxValue=max(allData);
if dataNum>200
thresholds=linspace(minValue, maxValue);
else
sorted=sort(allData);
thresholds=([sorted(1)-1, sorted]+[sorted, sorted(end)+1])/2;
end
for i=1:length(thresholds);
th=thresholds(i);
fp(i)=sum(data1>=th)/dataNum;
fn(i)=sum(data2< th)/dataNum;
end
plot(fn*100, fp*100, '.-');
set(gca, 'xscale', scaleStr, 'yscale', scaleStr);
xlabel('False-negative error rate (%)');
ylabel('False-positive error rate (%)');
[junk, id(1)]=min(abs(fn-fp));
[junk, id(2)]=min(abs(5*fn-fp));
[junk, id(3)]=min(abs(fn-5*fp));
for i=1:length(id);
index=id(i);
th=thresholds(index);
line(fn(index)*100, fp(index)*100, 'color', 'r', 'marker', 'o');
text(fn(index)*100, fp(index)*100, sprintf(' \\theta=%.4f (fn=%.4f%%, fp=%.4f%%)', th, 100*fn(index), 100*fp(index)));
end
axis square, grid on
% ====== Self demo
function selfdemo
data1=randn(1,100)*5;
data2=randn(1,200)*2+3;
subplot(1,2,1);
feval(mfilename, data1, data2);
subplot(1,2,2);
feval(mfilename, data1, data2, 'log');
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?