2012/02/03

# Draw ROC Curve

A piece of fairly simple Matlab script to draw the ROC Curve from an array of scores and an array of labels.

```
function [Tps, Fps] = ROC(scores, labels)
%% Sort Labels and Scores by Scores
sl = [scores; labels];
[d1 d2] = sort(sl(1,:));
sorted_sl = sl(:,d2);
s_scores = sorted_sl(1,:);
s_labels = round(sorted_sl(2,:));
%% Constants
counts = histc(s_labels, unique(s_labels));
Tps = zeros(1, size(s_labels,2) + 1);
Fps = zeros(1, size(s_labels,2) + 1);
negCount = counts(1);
posCount = counts(2);
%% Shift threshold to find the ROC
for thresIdx = 1:(size(s_scores,2)+1)
% for each Threshold Index
tpCount = 0;
fpCount = 0;
for i = [1:size(s_scores,2)]
if (i >= thresIdx) % We think it is positive
if (s_labels(i) == 1) % Right!
tpCount = tpCount + 1;
else % Wrong!
fpCount = fpCount + 1;
end
end
end
Tps(thresIdx) = tpCount/posCount;
Fps(thresIdx) = fpCount/negCount;
end
%% Draw the Curve
% Sort [Tps;Fps]
x = Tps;
y = Fps;
% Interplotion to draw spline line
count = 100;
dist = (x(1) - x(size(x,2)))/100;
xx = [x(1):-dist:x(size(x,2))];
% In order to get the interpolations, we remove all the unique numbers
[d1 d2] = unique(x);
uni_x = x(1,d2);
uni_y = y(1,d2);
yy = spline(uni_x,uni_y,xx);
% No value should exceed 1
yy = min(yy, 1);
plot(x,y,'x',xx,yy);
```

Hope it helps.

Some improvements were added.

For a sample input:

```
>> scores = rand(1,20)*100
scores =
Columns 1 through 7
43.8744 38.1558 76.5517 79.5200 18.6873 48.9764 44.5586
Columns 8 through 14
64.6313 70.9365 75.4687 27.6025 67.9703 65.5098 16.2612
Columns 15 through 20
11.8998 49.8364 95.9744 34.0386 58.5268 22.3812
>> labels = round(rand(1,20))
labels =
Columns 1 through 12
1 0 1 1 1 1 1 0 0 0 1 0
Columns 13 through 20
1 0 1 0 0 0 1 0
>> ROC(scores,labels);
```

Gives an output like:

Fork it on Github: DrawROC on Github

6 Comments

can u give the sample data for scores and labels as input for this function.Thanks.

A sample is added :]

can u provide the code to measure the ROC curve(AUC) for the given output? Thanks

Not reach this step yet. Once I get something on AUC, I may post it here. :]

无意中搜到楼主的代码，感谢楼主。另外我想问一下，楼主有area under the ROC curve的代码吗？谢谢

If i have the values of sensitivity and specificity, how do i use this function to plot my ROC curve