Wie kann ich eine gleichmäßige Verteilung (wie die meisten Zufallszahlengeneratoren beispielsweise zwischen 0,0 und 1,0 erzeugen) in eine Normalverteilung umwandeln? Was ist, wenn ich einen Mittelwert und eine Standardabweichung meiner Wahl möchte?
106
Antworten:
Der Ziggurat-Algorithmus ist dafür ziemlich effizient, obwohl die Box-Muller-Transformation einfacher von Grund auf neu zu implementieren ist (und nicht verrückt langsam).
quelle
Es gibt viele Methoden:
quelle
Um die Verteilung einer Funktion auf eine andere zu ändern, müssen Sie die Umkehrung der gewünschten Funktion verwenden.
Mit anderen Worten, wenn Sie eine bestimmte Wahrscheinlichkeitsfunktion p (x) anstreben, erhalten Sie die Verteilung, indem Sie darüber integrieren -> d (x) = Integral (p (x)) und deren Umkehrung verwenden: Inv (d (x)) . Verwenden Sie nun die Zufallswahrscheinlichkeitsfunktion (die gleichmäßig verteilt ist) und wandeln Sie den Ergebniswert durch die Funktion Inv (d (x)). Sie sollten zufällige Werte erhalten, die entsprechend der von Ihnen gewählten Funktion verteilt werden.
Dies ist der generische mathematische Ansatz. Wenn Sie ihn verwenden, können Sie jetzt jede Wahrscheinlichkeits- oder Verteilungsfunktion auswählen, die Sie haben, solange sie eine inverse oder gute inverse Approximation hat.
Hoffe das hat geholfen und danke für die kleine Bemerkung zur Verwendung der Distribution und nicht der Wahrscheinlichkeit selbst.
quelle
Hier ist eine Javascript-Implementierung unter Verwendung der polaren Form der Box-Muller-Transformation.
quelle
Verwenden Sie den zentralen Grenzwertsatz Wikipedia-Eintrag Mathworld-Eintrag zu Ihrem Vorteil.
Generieren Sie n der gleichmäßig verteilten Zahlen, summieren Sie sie, subtrahieren Sie n * 0,5 und Sie haben die Ausgabe einer ungefähr normalen Verteilung mit einem Mittelwert von 0 und einer Varianz von
(1/12) * (1/sqrt(N))
(siehe Wikipedia zu gleichmäßigen Verteilungen für die letzte).n = 10 gibt dir schnell etwas halbwegs Anständiges. Wenn Sie etwas mehr als halbwegs Anständiges wollen, entscheiden Sie sich für eine Tyler-Lösung (wie im Wikipedia-Eintrag zu Normalverteilungen angegeben ).
quelle
Ich würde Box-Muller benutzen. Zwei Dinge dazu:
Regel wird ein Wert zwischengespeichert und der andere zurückgegeben. Beim nächsten Aufruf eines Beispiels geben Sie den zwischengespeicherten Wert zurück.
Sie müssen dann den Z-Score um die Standardabweichung skalieren und den Mittelwert addieren, um den vollen Wert in der Normalverteilung zu erhalten.
quelle
Wobei R1, R2 zufällige einheitliche Zahlen sind:
NORMALE VERTEILUNG mit SD von 1: sqrt (-2 * log (R1)) * cos (2 * pi * R2)
Das ist genau ... Sie müssen nicht all diese langsamen Schleifen machen!
quelle
Es scheint unglaublich, dass ich nach acht Jahren noch etwas hinzufügen könnte, aber für den Fall von Java möchte ich die Leser auf die Random.nextGaussian () -Methode verweisen , die für Sie eine Gaußsche Verteilung mit einem Mittelwert von 0,0 und einer Standardabweichung von 1,0 generiert.
Eine einfache Addition und / oder Multiplikation ändert den Mittelwert und die Standardabweichung an Ihre Bedürfnisse.
quelle
Dies ist meine JavaScript-Implementierung von Algorithmus P ( Polar-Methode für normale Abweichungen ) aus Abschnitt 3.4.1 von Donald Knuths Buch The Art of Computer Programming :
quelle
Das Standard-Python-Bibliotheksmodul random hat das, was Sie wollen:
Schauen Sie sich für den Algorithmus selbst die Funktion in random.py in der Python-Bibliothek an.
Der manuelle Eintrag ist hier
quelle
Ich denke, Sie sollten dies in EXCEL versuchen :
=norminv(rand();0;1)
. Dies ergibt die Zufallszahlen, die normalerweise mit dem Mittelwert Null verteilt werden sollen, und vereint die Varianz. "0" kann mit einem beliebigen Wert angegeben werden, so dass die Zahlen den gewünschten Mittelwert haben. Durch Ändern von "1" erhalten Sie die Varianz, die dem Quadrat Ihrer Eingabe entspricht.Zum Beispiel:
=norminv(rand();50;3)
ergibt die normalverteilten Zahlen mit MEAN = 50 VARIANCE = 9.quelle
F Wie kann ich eine Gleichverteilung (wie die meisten Zufallszahlengeneratoren, z. B. zwischen 0,0 und 1,0) in eine Normalverteilung umwandeln?
Für die Software-Implementierung kenne ich einige zufällige Generatornamen, die Ihnen eine pseudo-einheitliche zufällige Sequenz in [0,1] geben (Mersenne Twister, Linear Congruate Generator). Nennen wir es U (x)
Es gibt einen mathematischen Bereich, der Wahrscheinlichkeitstheorie genannt wird. Das erste: Wenn Sie rv mit der Integralverteilung F modellieren möchten, können Sie versuchen, nur F ^ -1 (U (x)) auszuwerten. In der Theorie wurde bewiesen, dass ein solches RV eine integrale Verteilung F haben wird.
Schritt 2 kann angewendet werden, um rv ~ F ohne Verwendung von Zählmethoden zu erzeugen, wenn F ^ -1 ohne Probleme analytisch abgeleitet werden kann. (zB exp.distribution)
Um die Normalverteilung zu modellieren, können Sie y1 * cos (y2) berechnen, wobei y1 ~ in [0,2pi] einheitlich ist. und y2 ist die relei Verteilung.
F: Was ist, wenn ich einen Mittelwert und eine Standardabweichung meiner Wahl möchte?
Sie können Sigma * N (0,1) + m berechnen.
Es kann gezeigt werden, dass eine solche Verschiebung und Skalierung zu N (m, Sigma) führt.
quelle
Dies ist eine Matlab-Implementierung, die die polare Form der Box-Muller- Transformation verwendet:
Funktion
randn_box_muller.m
:Und dies aufzurufen
histfit(randn_box_muller(10000000),100);
ist das Ergebnis:Offensichtlich ist es im Vergleich zum eingebauten Matlab- Randn wirklich ineffizient .
quelle
Ich habe den folgenden Code, der vielleicht helfen könnte:
quelle
Es ist auch einfacher, die implementierte Funktion rnorm () zu verwenden, da sie schneller ist als das Schreiben eines Zufallszahlengenerators für die Normalverteilung. Siehe den folgenden Code als Beweis
quelle
quelle