Matlab, как рассчитать AUC (площадь под кривой)?

У меня есть файл data.txt с двумя столбцами и N строками, примерно так:

0.009943796 0.4667975
0.009795735 0.46777886
0.009623984 0.46897832
0.009564759 0.46941447
0.009546991 0.4703958
0.009428543 0.47224948
0.009375241 0.47475737
0.009298249 0.4767201
[...]

Каждой паре значений в файле соответствуют координаты одной точки (x, y). При нанесении на график эти точки образуют кривую. Я хотел бы рассчитать площадь под кривой (AUC) этой кривой.

Итак, я загружаю данные:

data = load("data.txt");
X = data(:,1);
Y = data(:,2);

Итак, X содержит все координаты x точек, а Y - все координаты y.

Как я могу рассчитать площадь под кривой (AUC)?


person DavideChicco.it    schedule 28.12.2011    source источник
comment
По-разному. Достаточно ли вам трапециевидного правила?   -  person Oliver Charlesworth    schedule 28.12.2011
comment
mathworks.com/matlabcentral/fileexchange/   -  person Robert Harvey    schedule 28.12.2011
comment
@Robert: похоже, это область под кривой функции (в Matlab есть целая куча функций quadxxxx ()). OP ищет возможности численного интегрирования данных.   -  person Jason S    schedule 28.12.2011


Ответы (6)


Самый простой способ - использовать функцию трапециевидной формы trapz.

Если известно, что ваши данные гладкие, вы можете попробовать использовать правило Симпсона, но в MATLAB нет ничего встроенного в MATLAB для интеграции числовых данных с помощью правила Симпсона. (И я не уверен, как использовать его для данных x / y, где x не увеличивается постоянно)

person Jason S    schedule 28.12.2011
comment
Спасибо, ребята, я пробовал использовать trapz (), но он, как ни странно, всегда дает отрицательные значения. Почему это? Если это область, она всегда должна быть позитивной ... Есть идеи? Спасибо! - person DavideChicco.it; 29.12.2011
comment
Если кривая опускается ниже 0, площадь фактически уменьшится. Помните, это просто неотъемлемая часть. Чтобы получить положительный AUC, вам может потребоваться изменить базовый уровень. Например, вычтите min(Y) из Y. Или вы можете использовать abs(Y), чтобы суммировать положительные и отрицательные области. - person yuk; 29.12.2011
comment
Технически, если вы используете trapz(x,y), знак результата зависит от знака y и знака изменения x. (помните: это интеграл y dx) Итак, если ваши значения y положительны, но x уменьшается, вы получите отрицательное число. На самом деле это немного сложнее: для замкнутых кривых знак должен быть положительным для обхода по часовой стрелке и отрицательным для обхода против часовой стрелки (см. en.wikipedia.org/wiki/Green%27s_theorem#Area_Calculation). - person Jason S; 29.12.2011

просто добавьте AUC = trapz (X, Y) в свою программу, и вы получите площадь под кривой

person Simon    schedule 01.03.2012

Вы можете сделать что-то подобное:

AUC = sum((Y(1:end-1)+Y(2:end))/2.*...
  (X(2:end)-X(1:end-1)));
person Oli    schedule 02.01.2012
comment
Оли, не могли бы вы добавить объяснение или ссылку на уравнение, которое вы использовали? - person Tin; 21.02.2017

Источник: Ссылка

Пример в MATLAB, который поможет вам получить ответ ...

x=[3 10 15 20 25 30];
y=[27 14.5 9.4 6.7 5.3 4.5];
trapz(x,y)

Если у вас есть отрицательные значения в y, вы можете сделать следующее:

y=max(y,0)
person Faheem    schedule 02.05.2013

[~, ~, ~, AUC] = perfcurve (метки, оценки, posclass);

% posclass может быть 1

http://www.mathworks.com/matlabcentral/newsreader/view_thread/252131

person Nucular    schedule 16.07.2013

Есть несколько вариантов trapz для человека, готового самостоятельно написать код. Эта ссылка показывает реализацию правила Симпсона с включенным кодом Python. Также существует Обмен файлами По правилу симпсонов.

person patrik    schedule 19.06.2014