Wenn Sie linspace
mögen und bevorzugen Einzeiler, können Sie tun:
plt.plot(np.sort(a), np.linspace(0, 1, len(a), endpoint=False))
meinen Geschmack gegeben, ich habe fast immer:
# a is the data array
sorted_ = np.sort(a)
yvals = np.arange(len(sorted_))/float(len(sorted_))
plt.plot(sorted_, yvals)
was für mich funktioniert, auch wenn es >O(1e6)
Datenwerte. Wenn Sie wirklich unten Probe benötigen würde ich
sorted_ = np.sort(a)[::down_sampling_step]
bearbeiten reagieren gesetzt/bearbeiten zu kommentieren, warum ich endpoint=False
oder die yvals
wie oben definiert. Im Folgenden sind einige technische Details.
Die empirische CDF ist in der Regel formal als
CDF(x) = "number of samples <= x"/"number of samples"
definiert, um genau diese formale Definition passen Sie yvals = np.arange(1,len(sorted_)+1)/float(len(sorted_))
verwenden brauchen würde, damit wir yvals = [1/N, 2/N ... 1]
bekommen. Dieser Schätzer ist ein unverzerrter Schätzer, der in der Grenze der unendlichen Abtastwerte Wikipedia ref. mit der wahren CDF konvergiert.
Ich neige dazu, yvals = [0, 1/N, 2/N ... (N-1)/N]
zu verwenden, da (a) es einfacher, Code/mehr idomatic ist, (b), aber immer noch formal gerechtfertigt, da man immer CDF(x)
mit 1-CDF(x)
im Konvergenz Beweis austauschen kann, und (c) arbeitet mit der (einfaches) Downsampling-Verfahren wie oben beschrieben.
In einigen besonderen Fällen ist es sinnvoll
yvals = (arange(len(sorted_))+0.5)/len(sorted_)
, die zwischen diesen beiden Zwischen Konventionen zu definieren ist. In der Tat sagt es "gibt es eine 1/(2N)
Chance von einem Wert weniger als die niedrigste, die ich in meiner Probe gesehen habe, und eine 1/(2N)
Chance von einem Wert größer als die größte, die ich bisher gesehen habe.
Für große Stichproben und vernünftige Verteilungen ist die im Hauptteil der Antwort gegebene Konvention jedoch leicht zu schreiben, ist ein unvoreingenommener Schätzer der wahren CDF und arbeitet mit der Downsampling-Methode.
Nur eine kurze Notiz: dieser Code tatsächlich Ihnen die empirischen CDF nicht geben (eine Funktion Schritt Erhöhung um 1/n bei jedem der n Datenpunkte). Stattdessen gibt dieser Code eine Schätzung der CDF basierend auf einer histogrammbasierten Schätzung der PDF. Diese histogrammbasierte Schätzung kann durch sorgfältige/unpassende Auswahl der Bins manipuliert/vorgespannt werden, so dass es eine nicht so gute Charakterisierung der echten CDF wie der tatsächlichen ECDF ist. –
Ich mag auch nicht den Punkt, dass dies Binning auferlegt; siehe Dave's kurze Antwort, die einfach 'numpy.sort' verwendet, um die CDF ohne Binning zu plotten. –