在 Matlab 中绘制 ROC 曲线
Plot ROC curve in Matlab
我需要在 matlab 中绘制 ROC 曲线。我有两个数组,一个包含真阳性率,一个包含假阳性率。我已经用两个数组作为输入尝试了 plotroc
和 perfcurve
,但它似乎不起作用。还有另一种方法可以用我拥有的数据绘制 ROC 曲线吗?
编辑
我发布图片是为了回答 Tasos Papastylianou:
简单地绘制两个数组它似乎并不是一条 ROC 曲线:S
EDIT2
上传阵列倒置的图像,仍然看起来不像 ROC!
EDIT3
图像显示我的 ROC 曲线图,在 [0,1] 中归一化
[]3
感谢@TasosPapastylianou 提供的评论,我解决了这个问题。为了在绘图中获得更好的结果,我在 x 轴(或误报率)上对两个数组进行排序。再次感谢@TasosPapastylianou !!!
我想我会 post 一个很好的 ROC 曲线示例的正确答案,展示我们在评论中讨论的内容:
%% Create datasets
[X,Y] = ndgrid(1:100,1:100);
% Ground Truth image
Circle= zeros(100); Circle((X-50).^2 + (Y-50).^2 - 500 <= 0) = 1;
% Test image (parameterised by threshold)
pkg load statistics % if using octave - needed for 'mvnpdf'
pkg load image % if using octave - needed for 'mat2gray'
Gaussian = mvnpdf([X(:), Y(:)], [45, 45], [500,0;0,500]);
Gaussian = reshape(Gaussian, size(X));
Gaussian = mat2gray(Gaussian);
%% Generate ROC curve for a range of thresholds
ThresholdRange = 0 : 0.025 : 1;
TPs = zeros(size(ThresholdRange));
FPs = zeros(size(ThresholdRange));
Ind = 0;
for Threshold = ThresholdRange
Ind = Ind + 1;
TP = Circle .* (Gaussian > Threshold);
T = Circle;
TPR = sum(TP(:)) / sum(T(:));
TPs(Ind) = TPR;
FP = (1 - Circle) .* (Gaussian > Threshold);
N = (1 - Circle);
FPR = sum(FP(:)) / sum(N(:));
FPs(Ind) = FPR;
end
%% Plotski curvski
plot(FPs, TPs, 'linewidth', 3, 'marker', 'o', 'markersize',10,'markeredgecolor', 'k', 'markerfacecolor', 'g');
hold on;
plot(ThresholdRange, ThresholdRange, 'r-.', 'linewidth', 3);
axis([0,1,0,1]);
title('Les Curves du ROC! Ooh-la-la!', 'fontsize', 16);
xlabel('Le Rate des Positifs Falses! Oh mon dieu!', 'fontsize', 14);
ylabel('Le Rate des Positifs Vrais! Magnifique!', 'fontsize', 14);
grid on;
我需要在 matlab 中绘制 ROC 曲线。我有两个数组,一个包含真阳性率,一个包含假阳性率。我已经用两个数组作为输入尝试了 plotroc
和 perfcurve
,但它似乎不起作用。还有另一种方法可以用我拥有的数据绘制 ROC 曲线吗?
编辑 我发布图片是为了回答 Tasos Papastylianou:
简单地绘制两个数组它似乎并不是一条 ROC 曲线:S
EDIT2
上传阵列倒置的图像,仍然看起来不像 ROC!
EDIT3
图像显示我的 ROC 曲线图,在 [0,1] 中归一化
[
感谢@TasosPapastylianou 提供的评论,我解决了这个问题。为了在绘图中获得更好的结果,我在 x 轴(或误报率)上对两个数组进行排序。再次感谢@TasosPapastylianou !!!
我想我会 post 一个很好的 ROC 曲线示例的正确答案,展示我们在评论中讨论的内容:
%% Create datasets
[X,Y] = ndgrid(1:100,1:100);
% Ground Truth image
Circle= zeros(100); Circle((X-50).^2 + (Y-50).^2 - 500 <= 0) = 1;
% Test image (parameterised by threshold)
pkg load statistics % if using octave - needed for 'mvnpdf'
pkg load image % if using octave - needed for 'mat2gray'
Gaussian = mvnpdf([X(:), Y(:)], [45, 45], [500,0;0,500]);
Gaussian = reshape(Gaussian, size(X));
Gaussian = mat2gray(Gaussian);
%% Generate ROC curve for a range of thresholds
ThresholdRange = 0 : 0.025 : 1;
TPs = zeros(size(ThresholdRange));
FPs = zeros(size(ThresholdRange));
Ind = 0;
for Threshold = ThresholdRange
Ind = Ind + 1;
TP = Circle .* (Gaussian > Threshold);
T = Circle;
TPR = sum(TP(:)) / sum(T(:));
TPs(Ind) = TPR;
FP = (1 - Circle) .* (Gaussian > Threshold);
N = (1 - Circle);
FPR = sum(FP(:)) / sum(N(:));
FPs(Ind) = FPR;
end
%% Plotski curvski
plot(FPs, TPs, 'linewidth', 3, 'marker', 'o', 'markersize',10,'markeredgecolor', 'k', 'markerfacecolor', 'g');
hold on;
plot(ThresholdRange, ThresholdRange, 'r-.', 'linewidth', 3);
axis([0,1,0,1]);
title('Les Curves du ROC! Ooh-la-la!', 'fontsize', 16);
xlabel('Le Rate des Positifs Falses! Oh mon dieu!', 'fontsize', 14);
ylabel('Le Rate des Positifs Vrais! Magnifique!', 'fontsize', 14);
grid on;