Dans cet article, j'écrirai le code pour générer une variable qui suit $ N (0,1) $ en utilisant la méthode Box-Muller.
Soit les deux distributions uniformes indépendantes $ U_1 et U_2 $. A ce moment, on sait que les deux variables suivantes définies par $ X_1 et X_2 $ suivent une distribution normale (uniquement le résultat ou 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}
→ Faites attention à la "condition de mélange" de $ U_1 et U_2 $ sur le côté droit. (Si vous faites une erreur ici, la distribution aura l'air étrange.)
Cette fois, nous utiliserons numpy
, seaborn
, alors préparons-nous.
## preparation
import numpy as np
import seaborn as sns
Utilisez la fonction np.random.uniform (0,1)
qui prend une valeur entre $ 0 \ sim 1 $.
Puisque nous devons créer des distributions uniformes indépendantes $ U_1 et U_2 $, nous les placerons dans le tableau.
Définissons le nombre d'échantillons sur «10000».
## 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)]
Pour le moment, (juste un contrôle visuel, mais ...)
sns.tsplot(random_list1)
→ Ça a l'air bien!
zip
Comme décrit dans "Présentation de l'algorithme Box-Muller", la "condition de mélange" de $ U_1 et U_2 $ est gênante, mais utilisons la fonction zip
ici.
zip(random_list1,random_list2))
Si tel est le cas, il récupérera un élément à la même position dans les deux tableaux random_list1
et random_list2
et créera une nouvelle liste. Imagewise
\begin{eqnarray}
list1 &=& [a_0, a_1, a_2, \ldots] \\
list2 &=& [b_0, b_1, b_2, \ldots]
\end{eqnarray}
Contre
[[a_0,b_0], [a_1,b_1], [a_2,b_2] \ldots] ]
C'est une image qui revient.
map
Cette fois, nous utiliserons la fonction map
et l'expression lambda
.
norm_list = map(lambda x: np.sqrt(-2*np.log(x[0]))*np.sin(2*np.pi*x[1]), zip(random_list1,random_list2))
→ Essayez $ X_2 $, qui se fait en retournant $ U_1 et U_2 $!
sns.distplot(norm_list)
D'une certaine manière, cela ressemble à une distribution normale w
Eh bien, dites-vous que tout le monde pense ensemble, n'est-ce pas préparé? !!
rnd = np.random.RandomState(0)
random_element = [rnd.randn() for i in range(N)]
sns.distplot(random_element)
Reference
Recommended Posts