2017-02-12 5 views
2

Ich mag gamma verteilte Zufallsvariablen mit scipy.stats.gamma.rvsWrapping Funktion verschiedene paremetres in Python verwenden

jedoch erzeugen, wobei die API übernimmt Form und Skalenparameter als Eingabe und ich mag Mittelwert und Standardabweichung als Eingabe verwenden.

Ich könnte einen Wrapper schreiben, der Mittelwert und Standard als Eingabe, berechnete Skalierung und Form und dann verwendet gamma.rvs, um die Zufallsvariable zu generieren. Aber ich erwarte viele Aufrufe dieser Funktion, daher würde ich es vorziehen, wenn ich die Berechnung nicht jedes Mal machen müsste.

kam ich auf die folgende Lösung:

from scipy.stats import gamma 


def gamma_rvs_generator(mu, sigma): 
    var = sigma ** 2 
    scale = var/mu 
    a = mu/scale 
    return lambda: gamma.rvs(a=a, scale=scale) 


if __name__ == '__main__': 
    gen = gamma_rvs_generator(10, 10) 
    print(gen()) 

Welche genau funktioniert genauso, wie ich es arbeiten wollen. Aber ich wollte fragen, ob es dafür bessere/mehr pythonische Lösungen gibt.

+0

eine alternative Möglichkeit wäre die Bearbeitung der API aber gut, das ist nicht der Fall. Übrigens, warum benutzt du 'Lambda'? – magicleon

+1

@magicleon Das macht es zu einer Funktion mit '0' Argumenten, die wiederholt aufgerufen werden können, erzeugen Sie jedes Mal eine andere Zufallszahl. Ohne das "Lambda" würde es eine einzelne Zufallszahl zurückgeben und somit erfordern, dass der Wrapper mit jeder neuen Zufallszahl wiederholt wird. –

+0

oh, wie ein Konstruktor? Nett! – magicleon

Antwort

3

Ich fühle mich - aber das ist eine Frage des Geschmacks - es wäre Pythonic seinen Vorteil rv_frozen Objekte zu nehmen:

from scipy.stats import gamma 


def gamma_alt(mu, sigma): 
    var = sigma ** 2 
    scale = var/mu 
    a = mu/scale 
    return gamma(a=a, scale=scale) 


if __name__ == '__main__': 
    gen = gamma_alt(10, 10) 
    print(gen.rvs()) 

Hinweis den Aufruf an gamma selbst, nicht gamma.rvs. Vorteil: Ihr gamma_alt verhält sich eher wie ein "normaler" scipy stats citizen. Zum Beispiel erhalten Sie nicht nur rvs, sondern automatisch auch pfd, cfd usw.