2010-01-16 19 views
23

Sto cercando di utilizzare boost :: normal_distribution per generare una distribuzione normale con media 0 e sigma 1.Come utilizzare le normali classi di distribuzione?

Il seguente codice non funziona poiché alcuni valori sono superiori o superiori a -1 e 1 (e non dovrebbe essere). Qualcuno potrebbe far notare cosa sto facendo male?

#include <boost/random.hpp> 
#include <boost/random/normal_distribution.hpp> 

int main() 
{ 
    boost::mt19937 rng; // I don't seed it on purpouse (it's not relevant) 

    boost::normal_distribution<> nd(0.0, 1.0); 

    boost::variate_generator<boost::mt19937&, 
          boost::normal_distribution<> > var_nor(rng, nd); 

    int i = 0; for (; i < 10; ++i) 
    { 
    double d = var_nor(); 
    std::cout << d << std::endl; 
    } 
} 

Il risultato sulla mia macchina è:

0.213436 
-0.49558 
1.57538 
-1.0592 
1.83927 
1.88577 
0.604675 
-0.365983 
-0.578264 
-0.634376 

Come si può vedere tutti i valori non sono tra -1 e 1.

Grazie a tutti in anticipo!

EDIT: Questo è ciò che accade quando si hanno scadenze ed evitare di studiare la teoria prima di fare la pratica.

+7

Ho dimenticato quasi tutte le mie statistiche, ma la varianza (che è il secondo parametro del sistema di distribuzione) sicuramente non specifica un valore assoluto per un intervallo? È una misura di come sono diffuse le cose. –

+0

@Neil Butterworth: il secondo parametro nel costruttore è la deviazione standard (radice quadrata della varianza). – jason

+0

Bene, ho detto che avevo dimenticato quasi tutto! –

risposta

29

Il seguente codice non funziona poiché alcuni valori sono superiori o superiori a -1 e 1 (e non dovrebbero essere). Qualcuno potrebbe far notare cosa sto facendo male?

No, questo è un equivoco della deviazione standard (il secondo parametro nel costruttore) della distribuzione normale.

La distribuzione normale è la familiare curva a campana. Quella curva ti dice in modo efficace la distribuzione dei valori. Valori vicini a quelli in cui i picchi della curva a campana sono più probabili di valori lontani (la coda della distribuzione).

La deviazione standard indica come sono distribuiti i valori. Più piccolo è il numero, più i valori concentrati sono intorno alla media. Maggiore è il numero, i valori meno concentrati sono intorno alla media. Nell'immagine sotto si vede che la curva rossa ha una varianza (la varianza è il quadrato della deviazione standard) di 0,2. Confronta questo con la curva verde che ha la stessa media ma una varianza di 1.0. Puoi vedere che i valori nella curva verde sono più distribuiti rispetto alla curva rossa. La curva viola ha varianza 5.0 e i valori sono ancora più distribuiti.

Quindi, questo spiega perché i valori non sono limitati a [-1, 1]. Tuttavia, è interessante notare che il 68% dei valori si trova sempre all'interno di una deviazione standard della media. Quindi, come prova interessante per te stesso scrivi un programma per disegnare un gran numero di valori da una distribuzione normale con la media 0 e la varianza 1 e conta il numero che si trova all'interno di una deviazione standard della media. Dovresti ottenere un numero vicino al 68% (68.2689492137% per essere un po 'più preciso).

alt text

: Dalla spinta documentation:

normal_distribution(RealType mean = 0, RealType sd = 1);

Costruisce una distribuzione normale con media media e DS deviazione standard.

8

Non stai facendo niente di male. Per una distribuzione normale, sigma specifica la deviazione standard , non l'intervallo. Se generi abbastanza campioni, vedrai che solo circa il 68% di essi si trova nell'intervallo [media - sigma, media + sigma], circa il 95% entro 2 sigma, e oltre il 99% entro 3 sigma.

Problemi correlati