2016-04-01 18 views
0

ich die folgende Liste von Werten haben:empirische Verteilungsfunktion in Numpy

x = [-0.04124324405924407, 0, 0.005249724476788287, 0.03599351958245578, -0.00252785423151014, 0.01007584102031178, -0.002510349639322063,...] 

und ich möchte die empirische Dichtefunktion berechnen, so dass ich glaube, ich brauche die empirische kumulative Verteilungsfunktion zu berechnen, und ich verwendet habe, dieser Code:

counts = np.asarray(np.bincount(x), dtype=float) 
cdf = counts.cumsum()/counts.sum() 

und dann berechne ich diesen Wert:

print cdf[0.01007584102031178] 

und ich bekomme immer 1, also habe ich einen Fehler gemacht. Weißt du, wie man es repariert? Danke!

Antwort

1

Es gibt zwei Dinge schief gehen hier:

np.bincount nur Sinn, auf eine Reihe von ganzen Zahlen macht. Es erstellt ein Histogramm der Array-Werte, gerundet auf eine Ganzzahl. Verwenden Sie für ein weicheres Histogramm np.histogram. Es kann auf Fließkommazahlen arbeiten, und Sie können die Anzahl der Bin- oder Bin-Grenzen sowie die Normalisierung angeben.

Zusätzlich bezeichnet cdf ein normales numpy Array in Ihrem Fall. Die Array-Indizes können nur ganze Zahlen sein, daher wird Ihre Abfrage cdf[0.01007584102031178] auf cdf[0] abgerundet.

Also zählt Ihr Code zuerst die ganzen Zahlen (sie sind alle auf 0 gerundet), also ist Ihre normalisierte cdf danach nur cdf == [ 1. ]. Dann wird der Index abgerundet, so dass Sie cdf[0] abfragen, was 1 ist.

+0

Thank you very much. Soll ich das tun: counts = np.asarray (np.histogram (x))? Ich bin nicht sehr gut mit dieser Art von Methoden ... – Angelina

+0

Nein, Sie müssen nicht NumPy Ergebnisse in Array zu werfen, sie sind bereits NumPy-Arrays selbst. – jojonas

2

Die übliche Definition des empirischen cdf ist die Anzahl der Beobachtungen kleiner oder gleich dem gegebenen Wert dividiert durch die Gesamtzahl der Beobachtungen. Mit 1d numpy Arrays ist dies x[x <= v].size/x.size (float Division, in python2 Sie from __future__ import division benötigen):

x = np.array([-0.04124324405924407, 0, 
       0.005249724476788287, 0.03599351958245578, 
       -0.00252785423151014, 0.01007584102031178, 
       -0.002510349639322063]) 
v = 0.01007584102031178 
print(x[x <= v].size/x.size) 

0.857142857143 druckt, (der tatsächliche Wert, wenn die empirischen CDF bei 0,01007584102031178 ist 07.06).

Dies ist ziemlich teuer, wenn Ihr Array groß ist und Sie müssen das CDF für mehrere Werte berechnen. In solchen Fällen können Sie eine sortierte Kopie Ihrer Daten halten und np.searchsorted() verwenden, um die Anzahl der Beobachtungen herauszufinden < = v:

def ecdf(x): 
    x = np.sort(x) 
    def result(v): 
     return np.searchsorted(x, v, side='right')/x.size 
    return result 

cdf = ecdf(x) 
print(cdf(v))