In diesem Artikel schreibe ich den Code, um mit der Box-Muller-Methode eine Variable zu generieren, die auf $ N (0,1) $ folgt.
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.)
Dieses Mal werden wir "numpy", "seaborn" verwenden, also lasst uns vorbereiten.
## preparation
import numpy as np
import seaborn as sns
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)]
Vorerst (nur eine visuelle Überprüfung, aber ...)
sns.tsplot(random_list1)
→ Irgendwie sieht es okay aus!
zip
-FunktionWie 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.
map
FunktionDieses 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!
sns.distplot(norm_list)
Irgendwie sieht es aus wie eine Normalverteilung w
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)
Reference
Recommended Posts