function [tp, fp] = fastroc(t, y)
%
% FASTROC - generate a receiver operating characteristic curve
%
% [TP,FP] = FASTROC(T,Y) gives the true-positive rate (TP) and false
% positive rate (FP), where Y is a column vector giving the score assigned
% to each pattern and T indicates the true class (a value above zero
% represents the positive class and anything else represents the negative
% class). To plot the ROC curve,
%
% PLOT(FP,TP);
% XLABEL('FALSE POSITIVE RATE');
% YLABEL('TRUE POSITIVE RATE');
% TITLE('RECEIVER OPERATING CHARACTERISTIC (ROC)');
%
% N.B. This version is only appropriate for classifiers with a continuous
% output (e.g. a probability, log-odds ratio, score etc.) as it doesn't
% handle ties correctly.
%
% See [1] for further information.
%
% [1] Fawcett, T., "ROC graphs : Notes and practical
% considerations for researchers", Technical report, HP
% Laboratories, MS 1143, 1501 Page Mill Road, Palo Alto
% CA 94304, USA, April 2004.
%
% See also : ROCCH, AUROC
%
% File : fastroc.m
%
% Date : Friday 9th June 2005
%
% Author : Dr Gavin C. Cawley
%
% Description : Generate an ROC curve for a two-class classifier.
%
% References : [1] Fawcett, T., "ROC graphs : Notes and practical
% considerations for researchers", Technical report, HP
% Laboratories, MS 1143, 1501 Page Mill Road, Palo Alto
% CA 94304, USA, April 2004.
%
% History : 10/11/2004 - v1.00
% 09/06/2005 - v1.10 - minor recoding
%
% Copyright : (c) G. C. Cawley, June 2005.
%
% This program is free software; you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation; either version 2 of the License, or
% (at your option) any later version.
%
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with this program; if not, write to the Free Software
% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
%
% process targets
t = t > 0;
% sort by classifier output
[Y,idx] = sort(-y);
t = t(idx);
% compute true positive and false positive rates
tp = cumsum(t)/sum(t);
fp = cumsum(~t)/sum(~t);
% add trivial end-points
tp = [0 ; tp ; 1];
fp = [0 ; fp ; 1];
% bye bye...