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 + -
显示快捷键?