Metoda Box-Muller
Metoda Box-Muller ( George EP Box și Mervin E. Muller, 1958) constă în generarea de perechi de numere aleatorii cu distribuție normală centrată redusă , dintr-o sursă de numere aleatorii de distribuție uniformă .
Transformarea ia de obicei două forme.
- Forma „simplă” transformă coordonatele polare distribuite uniform în coordonate carteziene distribuite în mod normal.
- Forma „polară” transformă coordonatele carteziene distribuite uniform în cercul unitar (obținut prin respingere ) în coordonate distribuite în mod normal .
Metoda transformării inverse poate fi utilizată și pentru a genera numere distribuite în mod normal; metoda Box-Muller este mai precisă și mai rapidă. Putem lua în considerare și metoda ziggurat , care este mult mai rapidă.
Metoda polară este cea utilizată de biblioteca standard C ++ a compilatorului GCC pentru a testa variabile de distribuție normale.
Scripturi
Transformare Box-Muller
Fie și două variabile aleatoare independente distribuite uniform în] 0,1].
U1{\ displaystyle U_ {1}}U2{\ displaystyle U_ {2}}
Fi
Z0=Rcos(Θ)=-2lnU1cos(2πU2){\ displaystyle Z_ {0} = R \ cos (\ Theta) = {\ sqrt {-2 \ ln U_ {1}}} \ cos (2 \ pi U_ {2}) \,}și
Z1=Rpăcat(Θ)=-2lnU1păcat(2πU2).{\ displaystyle Z_ {1} = R \ sin (\ Theta) = {\ sqrt {-2 \ ln U_ {1}}} \ sin (2 \ pi U_ {2}). \,}Atunci Z 0 și Z 1 sunt variabile aleatorii independente care urmează o distribuție normală centrată redusă.
Metoda polară
Această metodă, datorită lui George Marsaglia (ro) și TA Bray, se bazează pe următorul fapt: dacă este un punct ales uniform pe discul unității, atunci este o variabilă uniformă pe segment și un punct uniform pe cerc, toate două independente. Rezultă, prin transformarea Box-Muller, că
(X,Da){\ displaystyle (X, Y)}U=X2+Da2{\ displaystyle U = X ^ {2} + Y ^ {2}}[0,1]{\ displaystyle [0,1]}(XU,DaU){\ displaystyle ({\ tfrac {X} {\ sqrt {U}}}, {\ tfrac {Y} {\ sqrt {U}}})}
Z0=X⋅-2lnUU,Z1=Da⋅-2lnUU{\ displaystyle Z_ {0} = X \ cdot {\ sqrt {\ frac {-2 \ ln U} {U}}}, \ quad Z_ {1} = Y \ cdot {\ sqrt {\ frac {-2 \ ln U} {U}}}}sunt variabile aleatoare independente care urmează o distribuție normală centrată redusă
Cuplul este eșantionat prin metoda de respingere . Variabilele și sunt trasate uniform și independent pe segment . Apoi calculăm . Dacă sau , să-l respingem și să alegem din nou un cuplu , până când aparține .
(X,Da){\ displaystyle (X, Y)}X{\ displaystyle X}Da{\ displaystyle Y}[-1,1]{\ displaystyle [-1,1]}U=X2+Da2{\ displaystyle U = X ^ {2} + Y ^ {2}}U≥1{\ displaystyle U \ geq 1}U=0{\ displaystyle U = 0}(X,Da){\ displaystyle (X, Y)}U{\ displaystyle U}]0,1[{\ displaystyle] 0.1 [}
Explicații
Justificarea acestei transformări vine din transformarea măsurii probabilității legii normale în coordonate polare:
12π2e-X2+y22dXdy=12πe-r22rdrdθ=(12e-s2ds)(12πdθ){\ displaystyle {\ frac {1} {{\ sqrt {2 \ pi}} ^ {2}}} e ^ {- {\ frac {x ^ {2} + y ^ {2}} {2}}} \, \ mathrm {d} x \, \ mathrm {d} y = {\ frac {1} {2 \ pi}} e ^ {- {\ frac {r ^ {2}} {2}}} r \ , \ mathrm {d} r \, \ mathrm {d} \ theta = \ left ({\ frac {1} {2}} e ^ {- {\ frac {s} {2}}} \ mathrm {d} s \ right) \ left ({\ frac {1} {2 \ pi}} \ mathrm {d} \ theta \ right)}prin setarea s = r 2 .
Vedem astfel că variabilele S și Θ sunt independente (densitatea cuplului este produsul densităților) și urmează două legi distincte:
-
S∼E(12){\ displaystyle S \ sim {\ mathcal {E}} \ left ({\ frac {1} {2}} \ right)} : S respectă o lege exponențială a parametrului 1/2.
-
Θ∼U([0;2π]){\ displaystyle \ Theta \ sim {\ mathcal {U}} \ left (\ left [0; 2 \ pi \ right] \ right)} : Θ urmează o lege uniformă continuă pe .[0;2π]{\ displaystyle \ left [0; 2 \ pi \ right]}
Variabila S este apoi generată prin metoda transformării inverse . Apoi, scrieți egalitățile și .
X=rcosθ{\ displaystyle x = r \ cos \ theta}y=rpăcatθ{\ displaystyle y = r \ sin \ theta}
Comparație între cele două forme
Metoda polară este o metodă de eșantionare de respingere , care folosește doar o parte din numerele generate de sursa aleatorie, dar este în practică mai rapidă decât transformarea Box-Muller, deoarece este mai ușor de calculat:
- nu folosește o funcție trigonometrică, care este costisitoare în timpul de calcul;
- generarea de numere aleatorii uniforme este destul de rapidă, deci nu este o problemă să pierdeți o parte din ea. În medie, ponderea punctelor respinse este (1-π / 4) ≈ 21,46%. Prin urmare, generăm în medie 4 / π ≈ 1,2732 numere aleatorii uniforme pentru a obține fiecare număr aleatoriu normal.
Note și referințe
-
George EP Box, Mervin E. Muller, „O notă privind generația devierilor normale aleatorii”, Analele statisticilor matematice
vol. 29, nr. 2 (iunie, 1958), pp. 610-611 DOI : 10.1214 / aoms / 1177706645 , JSTOR : 2237361
-
" c ++ - Cum distribuțiile clasei C ++ 11 transformă generatorul de bază? » , On Stack Overflow (accesat la 22 ianuarie 2020 )
-
(în) G. Marsaglia și TA Bray , „ O metodă convenabilă pentru generarea de variabile normale ” , SIAM Review , Vol. 6, n o 3,Iulie 1964, p. 260–264 ( ISSN 0036-1445 și 1095-7200 , DOI 10.1137 / 1006063 , citit online , accesat la 22 ianuarie 2020 )
-
Devroye, Luc. , Generare variabilă neuniformă aleatorie , Springer-Verlag ,1986, 843 p. ( ISBN 978-1-4613-8643-8 , 1-4613-8643-8 și 978-1-4613-8645-2 , OCLC 696038277 , citit online ) , p. capitolul 5
-
Sheldon Ross, Un prim curs de probabilitate , (2002), p.279-81
<img src="https://fr.wikipedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" title="" width="1" height="1" style="border: none; position: absolute;">