[PYTHON] Zufallsgenerator, der der Normalverteilung N (0,1) folgt

In diesem Artikel schreibe ich den Code, um mit der Box-Muller-Methode eine Variable zu generieren, die auf $ N (0,1) $ folgt.

Box-Muller-Algorithmus - Übersicht

Die beiden unabhängigen Gleichverteilungen seien $ U_1 und U_2 $. Zu diesem Zeitpunkt ist bekannt, dass die folgenden zwei durch $ X_1 und X_2 $ definierten Variablen einer Normalverteilung folgen (nur das Ergebnis oder w).

\begin{eqnarray}
X_1 &=& \sqrt{-2\log(U_1)}\cos(2\pi U_2) \\
X_2 &=& \sqrt{-2\log(U_2)}\sin(2\pi U_1)
\end{eqnarray}

→ Beachten Sie die "Mischbedingung" von $ U_1 und U_2 $ auf der rechten Seite. (Wenn Sie hier einen Fehler machen, sieht die Verteilung seltsam aus.)

Vorbereitung

Dieses Mal werden wir "numpy", "seaborn" verwenden, also lasst uns vorbereiten.

## preparation
import numpy as np
import seaborn as sns

Schritt 1: Gleichmäßige Verteilung generieren

Verwenden Sie die Funktion np.random.uniform (0,1), die einen Wert zwischen $ 0 \ sim 1 $ annimmt. Da wir unabhängige gleichmäßige Verteilungen $ U_1 und U_2 $ erstellen müssen, werden wir sie in das Array einfügen.

Stellen wir die Anzahl der Samples auf "10000" ein.

## Sample size
N = 10000
## Uniform distributions
random_list1 = [np.random.uniform(0,1) for i in range(N)]
random_list2 = [np.random.uniform(0,1) for i in range(N)]

Schritt 2: Bestätigen Sie, dass es einheitlich ist

Vorerst (nur eine visuelle Überprüfung, aber ...)

sns.tsplot(random_list1)

Unknown.png

→ Irgendwie sieht es okay aus!

Schritt 3: 2 variable Bumps-zip -Funktion

Wie in "Box-Muller-Algorithmusübersicht" beschrieben, ist die "Mischbedingung" von $ U_1 und U_2 $ problematisch, aber verwenden wir hier die Funktion "zip".

zip(random_list1,random_list2))

In diesem Fall wird ein Element an derselben Position in den beiden Arrays "random_list1" und "random_list2" abgerufen und eine neue Liste erstellt. Stellen Sie sich vor

\begin{eqnarray}
list1 &=& [a_0, a_1, a_2, \ldots] \\
list2 &=& [b_0, b_1, b_2, \ldots]
\end{eqnarray}

Gegen

[[a_0,b_0], [a_1,b_1], [a_2,b_2] \ldots] ]

Es ist ein Bild, das zurückkehrt.

Schritt 4: Generiere -map Funktion

Dieses Mal werden wir die Funktion "map" und den Ausdruck "lambda" verwenden.

norm_list = map(lambda x: np.sqrt(-2*np.log(x[0]))*np.sin(2*np.pi*x[1]), zip(random_list1,random_list2))

→ Probieren Sie $ X_2 $ aus, indem Sie $ U_1 und U_2 $ umdrehen!

Schritt 5 ,, und was ist das Ergebnis?

sns.distplot(norm_list)

Unknown-1.png

Irgendwie sieht es aus wie eine Normalverteilung w

Schritt 6 Ein einfacher Weg?

Sagen Sie, dass alle zusammen denken, ist es nicht vorbereitet? !!

rnd = np.random.RandomState(0)
random_element = [rnd.randn() for i in range(N)]
sns.distplot(random_element)

Unknown-2.png

Reference

Recommended Posts

Zufallsgenerator, der der Normalverteilung N (0,1) folgt
Zufallsgenerator für französische Zahlen mit Python
Numpys Zufallsmodul Zufällige Generierung
Generator
Generator
Zufallsgenerator für französische Zahlen mit Python
Unendlicher Primgenerator in Python3
Primzahl
Natürliche Sorte
Generator Memo.
Zufallsgenerator, der der Normalverteilung N (0,1) folgt
Basisnummer
3. Normalverteilung mit neuronalem Netz!
Numpys Zufallsmodul Zufällige Generierung
Generieren Sie mit SciPy eine Normalverteilung
Nicht überlappende Erzeugung ganzzahliger Zufallszahlen (0-N-1)
Versuchen Sie, mit matplotlib eine Normalverteilung zu zeichnen
Bivariate Normalverteilung
Die Cholesky-Zerlegung war der Grund für die Erzeugung von Zufallszahlen nach einer multivariaten Normalverteilung.
Ich habe mit Numpy eine Grafik mit Zufallszahlen erstellt
Erstellen Sie eine Zufallszahl mit einer beliebigen Wahrscheinlichkeitsdichte
[Anmerkung] Zufällige Erstellung?
Überprüfung der Normalverteilung