AdamátorZápiskyHlášky

Metoda Monte Carlo – cvičení

Cvičícídoc. Ing. Jaromír Kukal, Ph.D.
Semestrzima 2024

Lineární kongruenční generátory

Nechť p je prvočíslo, x0∈p−1^ a a je generátor multiplikativní grupy modulo p. Definujme rekurentní posloupnost xn≔a⋅xn−1modp. Potom tato posloupnost bude postupně procházet všechna čísla z p−1^ v pseudonáhodném pořadí. Uděláme-li z ní náhodnou proměnnou X, potom bude X∼U(p−1^) neboli pro dostatečně velké p máme Y≔Xp∼U((0,1)). Ovšem zkusíme-li vyplnit čtverec tím, že střídavě generujeme souřadnice x a y, zjistíme, že ho to nevyplní, ale bude to na něm vytvářet jakési čáry.

Spočtěme si pro Y střední hodnotu a rozptyl:

EY=∫01xfY(x)dx=∫01xdx=12,
VarY=E(X−12)=112.

Ze zákona velkých čísel víme, že definujeme-li Z≔∑i=1mYi pro dostatečně velké m, bude přibližně Z∼N(m2,m12). Když z toho chceme udělat standardní normální rozdělení, znormujeme to:

Q≔Z−m2m12.

Ale pozor, zvolíme-li pro jednoduchost třeba m=12, tahle náhodná proměnná ve skutečnosti vždy bude v intervalu (−6,6). Tedy nemáme skutečně normální rozdělení.

Výpočet objemu

Pojďme si metodou Monte Carlo spočítat objem paraboloidu. Mějme bod u=(x,y,z)∈[−R,R]2×[0,H] a paraboloid A daný nerovnicí z≥HR2(x2+y2). Budeme-li bod brát rovnoměrně náhodně, potom objem paraboloidu můžeme spočítat jako

V=4R2H⋅p[u∈A]≕p.

Samozřejmě abychom tuto pravděpodobnost spočetli, musíme hodněkrát náhodně střílet. Budeme tedy mít náhodnou proměnnou M∼Bi(n,p). Poté můžeme odhadnout p≈MN. Skutečně platí EM=N⋅p. Ale s jakým rozptylem?

σ2=N⋅p⋅(1−p)≈N⋅MN⋅(1−MN)=M⋅(1−MN)
σ=M⋅1−MN
γ=σEM=1−MNM<1M=𝒪(M−12)=𝒪(N−12)

Taky můžeme použít polární souřadnice. Zvolíme náhodně φ∼U(0,2π). Ovšem u poloměru už nechceme rovnoměrné rozdělení, protože bodů vzdálenějších od středu je víc. Na přednášce si odvodíme, že je vhodné zvolit r∼U(0,1). Potom máme nerovnici z≥HR2⋅r a stačí spočítat πR2H⋅p.

Ještě jiný přístup. Místo abychom náhodně stříleli body v trojrozměrném prostoru, je budeme střílet ve dvojrozměrném a pro každý spočteme výšku paraboloidu v daném bodě. Tuto výšku spočteme jako

z=(1−r2R2)⋅H=(1−x2+y2R2)⋅H≕g(x,y),
Eg(X,Y)≈1N∑i=1Ng(xi,yi)≕g¯,
sx2=1N−1∑i=1N(g(xi,yi)−g¯)2.

Z toho si už můžeme snadno spočíst objem:

V=πr2⋅Eg(X,Y).

Nerovnoměrná rozdělení

Chceme generovat náhodnou proměnnou s exponenciální hustotou pravděpodobnosti
f(x)=[x≥0]⋅1μ⋅exp(−xμ).
Odpovídající distribuční funkce je
F(x)=∫−∞xf=[x≥0]⋅(1−exp(−xμ)).
Jak takovéto rozdělení nagenerujeme z náhodné proměnné s rovnoměrným rozdělením r∼R(0,1)? Stačí vyřešit rovnici F(x)=r. Vyjde nám
x=−μ⋅ln(1−r)=−μ⋅lnr*,r*∼R(0,1).
Tento přístup můžeme samozřejmě použít i pro jiná rozdělení. Mějme třeba Cauchyovo rozdělení
f(x)=1π(1+x2),
F(x)=12+arctanxπ.
Opět budeme řešit rovnici F(x)=r, čímž dostaneme
x=tan(π2⋅(2r−1)).
Jako poslední příklad si zkusme tímto způsobem vygenerovat rovnoměrné rozdělení x∼R(a,b).
f(x)=[x∈[a,b]]b−a,
F(x)={0x<a,x−ab−ax∈[a,b],1x>b.
Řešením rovnice F(x)=r, přičemž uvažujeme jenom „prostou část“ uprostřed, dostaneme
x=a+(b−a)⋅r.
To jsme samozřejmě mohli uhodnout, ale je dobré si ověřit, že systematický přístup sedí s intuicí.

Testování náhodné volby

Mějme nějaké náhodné rozdělení. Zvolíme si body x1<x2<⋯<xn−1, přičemž bereme x0≔−∞,xn≔∞. Tím si rozdělíme reálnou osu na šuplíčky. Pravděpodobnost, že se náhodná proměnná bude vyskytovat v k-tém šuplíčku, je
pk≔∫xk−1xkf=F(xk)−F(xk+1).
Provedeme-li N pozorování, dostaneme nějaká čísla N1,…,Nn vyjadřující, kolikrát jsme se trefili do kterého šuplíčku. Střední hodnota bude
Ok=N⋅pk.
V praxi chceme šuplíčky zvolit tak, aby bylo Ok≥5. Podle nějaké Pearsonovy věty platí
χ2≔∑k=1n(Nk−Ok)2Ok∼χn−12.

Box-Müllerova transformace

Cílem je vygenerovat z rovnoměrného rozdělení normální rozdělení. Kdybychom chtěli použít obecnou metodu pro nerovnoměrná rozdělení, dopadli bychom blbě, protože jak víme, kumulativní distribuční funkce nemá elementární tvar:
F(x)=∫−∞xf=∫−∞x12π⋅exp(−t22)dt.
Použijeme oblíbený trik, že si to rozšíříme do dvou rozměrů. Mějme funkci
f2(x,y)≔12π⋅exp(−x2+y22).
Přejdeme-li do polárních souřadnic, máme φ∼U((o,2π)). Pro distribuční funkci poloměru platí
FR(r)=∬x2+y2≤r212π⋅exp(−x2+y22)d(x,y)=∫0r∫02π12π⋅exp(−r~22)dφdr~=⋯=1−exp(−r22).
Tuhle funkci už dokážeme invertovat: máme-li rovnoměrnou proměnnou u, potom FR(r)=u, tedy r=−2⋅ln(1−u)=−2⋅lnu*.

Poissonovo rozdělení

Máme exponenciální rozdělení X∼Ex(μ),
f(x)=1μ⋅exp(−xμ)⋅I(x≥0),
F(x)=(1−exp(−xμ))⋅I(x≥0).
Dále existuje binomické rozdělení Y∼Bi(N,p),
py(N,p)=(Ny)py(1−p)N−y.
Jeho limitou pro N→∞,N⋅p=λ je Poissonovo rozdělení X∼Po(λ),
px(λ)=limN→∞py(N,λN)=λxx!⋅exp(−λ).
Teď nás zajímá, jak Poissonovo rozdělení generovat. Mohli bychom opět pro náhodnou proměnnou U∼U(0,1) řešit rovnici F(x)=u. Nyní už ale F není prostá funkce, takže si musíme ze všech možných řešení zvolit to nejmenší. Pro zjednodušení můžeme počítat
F0=p0=exp(−λ),Fx=Fx−1+px=Fx−1+λx⋅px−1.
Další možnost je aproximovat ho pomocí binomického, kde můžeme počítat
F0=p0=(1−p)N,Fy=Fy−1+py=Fy−1+p⋅(N−y+1)(1−p)⋅y⋅py−1.

Výpočet integrálu

Chceme spočítat I≔∫abf(x)dx. Víme-li, že Z≤f(x)≤Q, můžeme vzít náhodné proměnné X∼U(a,b),Y∼U(Z,Q) a máme
P[Y≤f(X)]=∫ab(f(x)−z)dx(b−a)⋅(Q−z)≕pHIT,
I=(b−a)⋅(Z+(Q−Z)⋅pHIT).
Střelíme-li náhodně N-krát a z toho se K-krát trefíme, můžeme aproximovat pHIT≈KN.Pro tuto metodu je
σ=(Q−Z)⋅pHIT⋅(1−pHIT)N=𝒪(1N)
Jiný způsob, jak by na to šlo jít, je vzít si náhodnou proměnnou X∼U(a,b) a počítat
Ef(X)=1b−a⋅∫abf(x)dx=Ib−a,
I=(b−a)⋅Ef(X)≈b−aN⋅∑i=1Nf(Xi),xi∼U(a,b).
Pro tuto metodu je
σ=1N⋅(b−a)⋅∫abg(x)2dx−(∫abg(x)dx)2=𝒪(N).
Rozptyl je menší než u předchozí metody.

Nevlastní integrál

Zkusme spočítat integrál
∫0∞cosωx1+x2dx.
Potřebujeme zavést nějakou substituci, která to dostane do omezeného intervalu. Jedna možnost je ξ≔x1+x. Tím dostaneme
∫01cosωξ1−ξ(1−ξ)2+ξ2dξ.
Další možnost by byla ξ≔exp(−x), čímž dostaneme
∫01cos(ω⋅lnξ)(1+ln2ξ)⋅ξdξ.
Nebo taky ξ≔2π⋅arctanx:
∫01π⋅cos(ω⋅tanπξ2)(1+tan2πξ2)⋅2⋅cos2πξ2.

Vícerozměrné integrály

Ukážeme si, v čem metoda Monte Carlo vyniká oproti deterministickým metodám integrace. Chceme-li spočítat ∫abf dělením intervalu na N kousíčků velikosti h≔a−bN a chceme přesnost ε=𝒪(hk), kde k je řád konvergence metody, časová náročnost bude
T(N)=𝒪(N)=𝒪(h−1)=𝒪(ε−1k).
Počítáme-li d-rozměrný integrál, kde j-tou dimenzi dělíme na Nj kousíčků, časová náročnost bude
T(N)=𝒪(∏j=1dNj)=𝒪(∏j=1dhj−1)=𝒪(h−d)=𝒪(ε−dk).
Kdybychom to na oblasti O⊂ℝd počítali metodou Monte Carlo, tak jak už jsme si odvozovali, přesnost bude
ε=σ⋅V(O)T(N),
z čehož máme T(N)=𝒪(ε−2). Metoda Monte Carlo bude tedy rychlejší v případě, kdy dk>2 neboli d>2k.