2011-12-28 15 views
6

Mam plik data.txt z dwoma kolumnami i N wierszy, coś takiego:Matlab, jak obliczyć AUC (obszar pod krzywą)?

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 
[...] 

Każda para wartości w pliku odpowiadają jednej współrzędnych punktów (x, y). Po wykreśleniu, punkty te generują krzywą. Chciałbym obliczyć powierzchnię pod krzywą (AUC) tej krzywej.

Więc załadować dane:

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

Więc X zawiera wszystkie x współrzędne punktów i Y wszyscy y współrzędnych.

Jak mogę obliczyć powierzchnię pod krzywą (AUC)?

+1

To zależy. Czy [reguła trapezowa] (http://en.wikipedia.org/wiki/Trapezium_rule) jest dla ciebie wystarczająco dobra? –

+0

http://www.mathworks.com/matlabcentral/fileexchange/24597-area-under-a-curve –

+0

@Robert: wygląda na to, że jest to obszar pod krzywą funkcji * (Matlab ma całą masę ' funkcje quad'xxxx()). OP szuka numerycznej integracji danych. –

Odpowiedz

3

Najprostszym sposobem jest funkcja reguła trapezoidalna trapz.

Jeśli twoje dane są gładkie, możesz spróbować użyć reguły Simpsona, ale nie ma w Matlabie nic wbudowanego w integrację danych liczbowych za pomocą reguły Simpsona. (& Nie jestem pewien, jak wykorzystać go do X/Y, gdzie X danych nie wzrasta stopniowo)

+0

Thanx faceci, próbowałem z trapz(), ale to dziwnie daje mi zawsze wartości ujemne. Dlaczego to? Jeśli jest to obszar, powinien być zawsze pozytywny ... Jakiś pomysł? Thanx! –

+3

Jeśli krzywa spadnie poniżej 0, obszar faktycznie zostanie zmniejszony. To jest po prostu integralne, pamiętaj. Aby uzyskać dodatnie AUC, może zajść potrzeba zmiany linii podstawowej. Na przykład odejmij 'min (Y)' od 'Y'.Lub możesz użyć 'abs (Y)' do podsumowania pozytywnych i negatywnych obszarów. – yuk

+2

Technicznie, jeśli użyjesz 'trapz (x, y)', znak wyniku zależy od znaku y i znaku zmiany wx. (pamiętaj: jest to integralna część y dx) Więc jeśli twoje wartości y są dodatnie, ale x maleje, otrzymasz liczbę ujemną. W rzeczywistości jest to nieco bardziej skomplikowane: dla zamkniętych krzywych znak powinien być dodatni, aby okrążać w kierunku przeciwnym do ruchu wskazówek zegara i ujemny dla otaczania przeciwnego do ruchu wskazówek zegara (patrz http://en.wikipedia.org/wiki/Green%27s_theorem#Area_Calculation). –

1

można zrobić coś takiego:

AUC = sum((Y(1:end-1)+Y(2:end))/2.*... 
    (X(2:end)-X(1:end-1))); 
+0

Oli, czy mógłbyś dodać wyjaśnienie lub link do równania, którego użyłeś? – Tin

4

wystarczy dodać AUC = trapz (X , Y) do programu i dostaniesz obszar pod krzywą

1

Źródło: Link

przykładem w programie MATLAB, które pomogą Ci uzyskać odpowiedź ...

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

W przypadku, gdy mają wartości ujemne w y, można zrobić podobne,

y=max(y,0) 
0

Istnieje kilka opcji do trapz dla osoby gotowe zrobić jakieś kodowanie przez siebie. Ten link pokazuje implementację Simpson's rule z dołączonym kodem Pythona. Istnieje również File Exchange na zasadzie Simpsonów.