2013-02-14 15 views

risposta

21

Con gli ottimi matplotlib e numpy pacchetti

from matplotlib import pyplot as mp 
import numpy as np 

def gaussian(x, mu, sig): 
    return np.exp(-np.power(x - mu, 2.)/(2 * np.power(sig, 2.))) 

for mu, sig in [(-1, 1), (0, 2), (2, 3)]: 
    mp.plot(gaussian(np.linspace(-3, 3, 120), mu, sig)) 

mp.show() 

produrrà qualcosa come plot showing gaussians of varying widths in varying colours

Inoltre - www.whathaveyoutried.com volte mi sento come una tazza compiti a casa.

+13

Il tuo PDF gaussiano è errato - devi ridimensionarlo (\ sqrt (2 \ pi) \ sigma)^(- 1). Inoltre, x * x è molto più veloce di pow (x, 2). –

8

Ti manca una parentesi nel denominatore della funzione gaussiana(). Come è adesso dividi per 2 e moltiplica con la varianza (sig^2). Ma questo non è vero e, come puoi vedere dalle tue trame, maggiore è la varianza, più stretto è il gaussiano - che è sbagliato, dovrebbe essere opposto.

Quindi basta cambiare la funzione gaussiana() a:

def gaussian(x, mu, sig): 
    return np.exp(-np.power(x - mu, 2.)/(2 * np.power(sig, 2.))) 
+0

Questa formula è sbagliata perché se la si integra da meno infinito a infinito si otterrà sqrt (2) * sqrt (pi) che non è giusto. La formula corretta è 1/sqrt (2 * pi) * exp (-x^2/2). Anche se, in questa forma, la sua media è 0 e la varianza è 1, puoi spostare e ridimensionare questo gaussiano come preferisci – Evgeny

9

si può leggere questo tutorial su come utilizzare le funzioni di distribuzioni statistiche in python. http://docs.scipy.org/doc/scipy/reference/tutorial/stats.html

from scipy.stats import norm 
import matplotlib.pyplot as plt 
import numpy as np 

#initialize a normal distribution with frozen in mean=-1, std. dev.= 1 
rv = norm(loc = -1., scale = 1.0) 
rv1 = norm(loc = 0., scale = 2.0) 
rv2 = norm(loc = 2., scale = 3.0) 

x = np.arange(-10, 10, .1) 

#plot the pdfs of these normal distributions 
plt.plot(x, rv.pdf(x), x, rv1.pdf(x), x, rv2.pdf(x)) 
4

Oltre alle risposte precedenti, vi consiglio di calcolare prima il rapporto con l'esponente, poi prendendo la piazza:

def gaussian(x,x0,sigma): 
    return np.exp(-np.power((x - x0)/sigma, 2.)/2.) 

In questo modo, è anche possibile calcolare la gaussiana di molto piccolo o numeri molto grandi:

In: gaussian(1e-12,5e-12,3e-12) 
Out: 0.64118038842995462 
5

la corretta, in base alla sintassi originale, e correttamente normalizzato è:

def gaussian(x, mu, sig): 
    return 1./(sqrt(2.*pi)*sig)*np.exp(-np.power((x - mu)/sig, 2.)/2) 
Problemi correlati