[PYTHON] Générateur aléatoire qui suit la distribution normale N (0,1)

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.

Présentation de l'algorithme 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.)

Préparation

Cette fois, nous utiliserons numpy, seaborn, alors préparons-nous.

## preparation
import numpy as np
import seaborn as sns

Étape 1: Générer une distribution uniforme

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)]

Étape 2: Confirmez qu'il est uniforme

Pour le moment, (juste un contrôle visuel, mais ...)

sns.tsplot(random_list1)

Unknown.png

→ Ça a l'air bien!

Étape 3: 2 fonctions variables-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.

Étape 4: Générer la fonction -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 $!

Step5 ,, et quel est le résultat?

sns.distplot(norm_list)

Unknown-1.png

D'une certaine manière, cela ressemble à une distribution normale w

Étape 6 Un moyen plus simple?

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)

Unknown-2.png

Reference

Recommended Posts

Générateur aléatoire qui suit la distribution normale N (0,1)
générateur de nombres aléatoires français avec python
Module aléatoire de Numpy Génération aléatoire
Générateur
Générateur
générateur de nombres aléatoires français avec python
Générateur principal infini en Python3
nombre premier
Tri naturel
Mémo du générateur.
Générateur aléatoire qui suit la distribution normale N (0,1)
Numéro de base
3. Distribution normale avec un réseau neuronal!
Module aléatoire de Numpy Génération aléatoire
Générer une distribution normale avec SciPy
Génération de nombres aléatoires entiers sans chevauchement (0-N-1)
Essayez de dessiner une distribution normale avec matplotlib
Distribution normale bivariée
La décomposition de Cholesky était à l'origine de la génération de nombres aléatoires suivant une distribution normale multivariée.
J'ai fait un graphique de nombres aléatoires avec Numpy
Créer un nombre aléatoire avec une densité de probabilité arbitraire
[Note] Création aléatoire?
Vérification de la distribution normale