在Matlab中绘制ROC曲线

在Matlab中绘制ROC曲线,matlab,roc,Matlab,Roc,我需要在matlab中绘制ROC曲线。我有两个数组,一个包含真阳性率,另一个包含假阳性率。我尝试了使用两个数组作为输入的plotroc和perfcurve,但似乎都不起作用。有没有另一种方法可以用我的数据绘制ROC曲线 编辑 为了回答塔索斯·帕帕斯蒂利亚努的问题,我发布了一张图片: 简单地绘制两个数组,它看起来并不是一条ROC曲线:S EDIT2 上传图像时阵列倒置,仍然不像ROC! EDIT3 显示我的ROC曲线图的图像,在[0,1]中标准化 []多亏@TasosPapastylianou

我需要在matlab中绘制ROC曲线。我有两个数组,一个包含真阳性率,另一个包含假阳性率。我尝试了使用两个数组作为输入的
plotroc
perfcurve
,但似乎都不起作用。有没有另一种方法可以用我的数据绘制ROC曲线

编辑 为了回答塔索斯·帕帕斯蒂利亚努的问题,我发布了一张图片:

简单地绘制两个数组,它看起来并不是一条ROC曲线:S

EDIT2 上传图像时阵列倒置,仍然不像ROC!

EDIT3 显示我的ROC曲线图的图像,在[0,1]中标准化
[]

多亏@TasosPapastylianou提供的评论,我才得以解决。为了获得更好的绘图结果,我在x轴上对两个数组进行排序(或假阳性率)。再次感谢@TASOSPAPSTYLEANOU

多亏@TasosPapastylianou提供的评论,我才下定决心。为了获得更好的绘图结果,我在x轴上对两个数组进行排序(或假阳性率)。再次感谢@TASOSPAPSTYLEANOU

我想我应该用一个很好的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;
%%创建数据集
[X,Y]=ndgrid(1:100,1:100);
%地面真实图像
圆=零(100);圆圈((X-50)。^2+(Y-50)。^2-500阈值);
T=圆;
TPR=sum(TP(:)/sum(T(:);
TPs(Ind)=TPR;
FP=(1-圆)。*(高斯>阈值);
N=(1-圈);
FPR=sum(FP(:)/sum(N(:));
FPs(Ind)=FPR;
结束
%%普洛斯基曲线
绘图(FPs、TPs、‘线宽’、3、‘标记’、‘o’、‘标记大小’、10、‘标记边缘颜色’、‘k’、‘标记表面颜色’、‘g’);
等等
绘图(ThresholdRange,ThresholdRange,'r-','linewidth',3);
轴([0,1,0,1]);
标题('Les Curves du ROC!Ooh la la!','fontsize',16);
xlabel('leratedespositifs Falses!噢,mondieu!','fontsize',14);
ylabel('Le Rate des Positifs Vrais!Magnifique!','fontsize',14);
网格化;

我想我应该用一个很好的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;
%%创建数据集
[X,Y]=ndgrid(1:100,1:100);
%地面真实图像
圆=零(100);圆圈((X-50)。^2+(Y-50)。^2-500阈值);
T=圆;
TPR=sum(TP(:)/sum(T(:);
TPs(Ind)=TPR;
FP=(1-圆)。*(高斯>阈值);
N=(1-圈);
FPR=sum(FP(:)/sum(N(:));
FPs(Ind)=FPR;
结束
%%普洛斯基曲线
绘图(FPs、TPs、‘线宽’、3、‘标记’、‘o’、‘标记大小’、10、‘标记边缘颜色’、‘k’、‘标记表面颜色’、‘g’);
等等
绘图(ThresholdRange,ThresholdRange,'r-','linewidth',3);
轴([0,1,0,1]);
标题('Les Curves du ROC!Ooh la la!','fontsize',16);
xlabel('leratedespositifs Falses!噢,mondieu!','fontsize',14);
ylabel('Le Rate des Positifs Vrais!Magnifique!','fontsize',14);
网格化;

ROC曲线实际上是FP与TP的比值。为什么不直接使用普通的绘图命令呢?@TasosPapastylianou嗨,我已经试过了,但是我得到了一个真正远离ROC曲线的东西。我编辑了这篇文章,这样你就可以看到这个简单的情节发生了什么!你是说形状?不。你不可能总是让教科书看起来平滑。这取决于验证的数量,阈值影响分类的方式,等等,你的轴不是从零开始的。将轴从0规格化为1,绘图将产生更敏感的问题。是的。我确信如果您添加更多的验证运行,尤其是针对更“极端”的阈值(即无用的阈值,它要么完全接受要么拒绝类)它看起来会更像你所期望的。ROC曲线实际上是FP vs TP。为什么不使用普通绘图命令?@TasosPapastylianou嗨,我试过了,但我得到了一些与ROC曲线相去甚远的东西。我编辑了这篇文章,这样你就可以看到简单绘图的结果了!你是说形状吗?不。你不总是能让教科书看起来平滑曲线e、 这取决于验证的数量,阈值影响分类的方式,等等,你的轴不是从零开始的。将你的轴从0标准化为1,绘图会产生更敏感的问题。是的,是的。我确信如果你添加更多验证运行,特别是对于更“极端”的阈值((即无用的,完全接受或拒绝课程)它看起来更像你期望的。