2017-02-08 5 views
3

Ich verstehe nicht, warum der folgende Code mit der normalen Funktion arbeitet und nicht für eine andere benutzerdefinierte Funktion:Wie man eine Dichte richtig abtastet?

, dass das Beispiel ist, wo ich die Normalverteilung zu probieren versucht:

n = 100000 
xx = np.random.uniform(-5, 5, n) 
rho = mpl.pylab.normpdf(xx, 0, 1) 
rnd = np.random.rand(n) 
ix = np.where(rho > rnd) 
xx = xx[ix] 
h = plt.hist(xx, bins=20, normed=True) 
# plot density 
x = np.linspace(-5, 5, 100) 
plt.plot(x, mpl.pylab.normpdf(x, 0, 1)) 

Es funktioniert und ich habe:

gaussian

wenn ich nun die Dichte verändert, ich es nicht richtig abtasten. Ich habe überprüft, ob die Dichte gut normiert ist und es ist. So verstehe ich nicht, wo ich bin falsch

n = 100000 
xx = np.random.uniform(0, 1, n) 
rho = 2 * np.sin(2 * xx * np.pi)**2 
rnd = np.random.rand(n) 
ix = np.where(rho > rnd) 
xx = xx[ix] 
h = plt.hist(xx, bins=20, normed=True) 
# plot density 
x = np.linspace(0, 1, 100) 
print(np.trapz(2 * np.sin(2 * x * np.pi)**2, x)) 
plt.plot(x, 2 * np.sin(2 * x * np.pi)**2) 

sin

Antwort

2

Sie tun rejection sampling

Im ersten Fall ist der maximale Wert der pdf ist < 1, und Sie rnd von [0,1] zeichnen , also sind alle Werte unterhalb der max. Sie werfen allerdings mehr Werte als nötig entfernt, da der max streng kleiner als 1 sind im zweiten Fall der max der pdf ist aber immer noch rnd von [0,1] in der Linie

rnd = np.random.rand(n) 

zeichnen Sie sollten diese Zeile so ändern, dass sie gleichmäßig von [0,2] abtastet. Beachten Sie, dass die etwas flachen Oberseiten Ihrer Histogramme den Teilen von [0,1] entsprechen, wenn die PDF> 1 ist. Ihr Code hat keine Möglichkeit, einige dieser Werte anders als andere zu behandeln.

2

Sie lehnen im ersten Beispiel zu viel ab und im zweiten nicht genug.

Optimaler Fall bei der Probenahme Y von 0 bis PDF max.

Im ersten Fall müssen Sie

rnd = np.random.rand(n)/np.sqrt(2.0 * np.pi) 

Im zweiten Fall

rnd = 2.0 * np.random.rand(n) 
+0

Guten Fang auf dem ersten Beispiel nennen. Beide Beispiele hatten Fehler, aber der zweite ist auffälliger (und signifikanter). –

+0

@ JohnColeman Ja, das ist richtig –