2013-10-26 8 views
6

random.gauss (mu, sigma)Come generare una distribuzione con una determinata media, varianza, inclinazione e curtosi in Python?

Sopra è una funzione che consente di elaborare in modo casuale un numero da una distribuzione normale con un dato media e varianza. Ma come possiamo trarre valori da una distribuzione normale definita da più dei soli due primi momenti?

qualcosa di simile:

random.gauss (mu, sigma, skew, curtosi)

+4

Qualsiasi distribuzione normale ha skew 0 e kurtosis 0. Utilizzare una famiglia diversa di distribuzioni. –

+1

Attenzione, esistono diversi modi per definire il calcolo di inclinazione e curtosi. I momenti non sono equivalenti a media, varianza, inclinazione e curtosi, sebbene abbiano lo stesso significato. –

+2

Inoltre, i momenti non specificano una distribuzione univoca. Vedi [questa domanda simile, ma chiedendo di R: http://stackoverflow.com/questions/4807398/how-to-generate-distributions-given-mean-sd-skew-and-kurtosis-in-r –

risposta

1

tenta di utilizzare questo:

http://statsmodels.sourceforge.net/devel/generated/statsmodels.sandbox.distributions.extras.pdf_mvsk.html#statsmodels.sandbox.distributions.extras.pdf_mvsk

ritorno della gaussiana funzione pdf espansa data la lista del 1 °, 2 ° momento e inclinazione e la curtosi (eccesso) di curtosi.

Parametri: mvsk: elenco di mu, mc2, skew, Kurt

Sembra buono con me. C'è un link al sorgente su quella pagina.

Oh, ed ecco l'altra domanda StackOverflow che mi ha segnalato lì: Apply kurtosis to a distribution in python

+0

C'è un comodo modo di trarre valori da questa distribuzione, piuttosto che calcolare la densità? – kuzzooroo

+0

cosa si intende per mc2 qui? Prevedo la varianza, ma voglio essere sicuro. –

4

Come sull'utilizzo SciPy? È possibile selezionare la distribuzione desiderata da continuous distributions in the scipy.stats library.

La funzione gamma generalizzata ha inclinazione e curtosi diverse da zero, ma è necessario un po 'di lavoro da fare per capire quali parametri utilizzare per specificare la distribuzione per ottenere una media, varianza, inclinazione e curtosi particolari. Ecco un codice per iniziare.

import scipy.stats 
import matplotlib.pyplot as plt 
distribution = scipy.stats.norm(loc=100,scale=5) 
sample = distribution.rvs(size=10000) 
plt.hist(sample) 
plt.show() 
print distribution.stats('mvsk') 

Questo mostra un istogramma di un campione di 10.000 elemento da una distribuzione normale con media 100 e varianza 25, e stampa statistiche della distribuzione:

(array(100.0), array(25.0), array(0.0), array(0.0))

Sostituzione distribuzione normale con la gamma generalizzata distribuzione,

distribution = scipy.stats.gengamma(100, 70, loc=50, scale=10) 

si ottiene la statistica [mean, varianza, skew, kurtosis] (array(60.67925117494595), array(0.00023388203873597746), array(-0.09588807605341435), array(-0.028177799805207737)).