Moje wykłady ograniczają się do zagadnień leżących w kompetencji rachunku prawdopodobieństwa i statystyki. U podstaw symulacji stochastycznych leży generowanie ,,liczb pseudo-losowych”, naśladujących zachowanie zmiennych losowych o rozkładzie jednostajnym. Jak to się robi, co to jest ,,pseudo-losowość”, czym się różni od ,,prawdziwej losowości”? To są fascynujące pytania, którymi zajmuje się: teoria liczb, teoria (chaotycznych) układów dynamicznych oraz filozofia. Dyskusja na ten temat przekracza ramy tych wykładów. Z punktu widzenia użytkownika, ,,liczby losowe” są bardzo łatwo dostępne, bo ich generatory są wbudowane w systemy komputerowe. Przyjmę pragmatyczny punkt widzenia i zacznę od następującego założenia.
Mamy do dyspozycji potencjalnie nieskończony ciąg
niezależnych zmiennych losowych
o jednakowym rozkładzie
.
W języku algorytmicznym: przyjmujemy, że każdorazowe wykonanie instrukcji zapisanej w pseudokodzie
Gen ![]() |
wygeneruje kolejną (nową) zmienną . Innymi słowy, zostanie wykonane nowe, niezależne
doświadczenie polegające na wylosowaniu przypadkowo wybranej liczby z przedziału
.
Wykonanie pseudokodu
for ![]() ![]() |
begin |
Gen ![]() |
write ![]() |
end |
da, powiedzmy, taki efekt:
0.32240106 0.38971803 0.35222521 0.22550039 0.04162166
0.13976025 0.16943910 0.69482111 0.28812341 0.58138865
Nawiasem mówiąc, rzeczywisty kod w R, który wyprodukował nasze 10 liczb losowych był taki:
U <- runif(10);
U
Język R jest zwięzły i piękny, ale nasz pseudokod ma pewne walory dydaktyczne.
Zajmiemy się teraz pytaniem, jak ,,wyprodukować” zmienne losowe o różnych rozkładach, wykorzystując zmienne .
W tym podrozdziale pokażę kilka przykładów, a w następnym przedstawię rzecz nieco bardziej systematycznie.
To jest wyjątkowo łatwy do generowania rozkład – wystarczy taki algorytm:
Gen ![]() ![]() |
Na wyjściu, . Żeby się o tym przekonać, wystarczy obliczyć dystrybuantę tej
zmiennej losowej:
.
Jest to najprostszy przykład ogólnej metody ,,odwracania dystrybuanty”, której poświęcę następny
podrozdział.
Zmienna losowa
![]() |
ma w przybliżeniu standardowy rozkład normalny . Wynika to
z Centralnego Twiedzenia Granicznego (jeśli uznamy, że liczba
jest
dostatecznie bliska
; zauważmy, że
i
). Oczywiście, w czasach szybkich komputerów
ta przybliżona metoda zdecydowanie nie jest polecana. Jest natomiast pouczające zbadać (symulacyjnie!) jak dobre jest przybliżenie. Faktycznie
bardzo trudno odróżnić próbkę
wyprodukowaną przez powyższy algorytm od próbki pochodzącej dokładnie z rozkłdu
(chyba, że
jest ogromne).
Oto, dla porównania, bardziej współczesna – i całkiem dokładna metoda generowania zmiennych o rozkładzie normalnym.
Gen ![]() |
Gen ![]() |
Gen ![]() ![]() |
Na wyjściu obie zmienne i
mają rozkład
i w dodatku są niezależne.
Uzasadnienie poprawności algorytmu Boxa-Müllera opiera się na dwu faktach: zmienna
ma rozkład
, zaś kąt
między osią i promieniem wodzącym punktu
ma
rozkład
.
Ciekawe, że łatwiej jest generować zmienne losowe normalne ,,parami”.
Doświadczenie, polegające na wygenerowaniu zmiennych losowych i
powtórzyłem
10000 razy. Na Rysunku 3.1 widać 10000 wylosowanych w ten sam sposób i niezależnie
punktów
, histogramy i gęstości brzegowe
i
(każda ze współrzędnych ma rozkłd
) oraz histogram i gęstość
(
rozkład wykładniczy
).
Histogram jest ,,empirycznym” (może w obecnym kontekście należałoby powiedzieć ,,symulacyjnym”) odpowiednikiem gęstości: spośród wylosowanych wyników zliczane są punkty należące do poszczególnych przedziałów.
Algorytm przedstawiony niżej nie jest efektywny, ale jest prosty do zrozumienia.
![]() |
Gen ![]() ![]() ![]() |
while ![]() |
begin Gen ![]() ![]() ![]() |
Na wyjściu .
Istotnie, niech
będą i.i.d.
i
. Wykorzystamy znany fakt, że
ma rozkład
.
Zmienne o rozkładzie wykładniczym przedstawiamy jako
– patrz Przykład
3.2.
Zamiast dodawać zmienne
możemy mnożyć zmienne
. Mamy
, gdzie
.
Zmienna losowa , która ma postać
, a więc jest pewną funkcją zmiennej
, w naturalny sposób ,,dziedziczy” rozkład prawdopodobieństwa
zgodnie z ogólnym schematem
(,,wykropkowany” argument jest zbiorem).
Przy tym zmienne
i
nie muszą być jednowymiarowe. Jeśli obie zmienne mają ten sam wymiar i
przekształcenie
jest dyfeomorfizmem, to dobrze znany wzór wyraża gęstość rozkładu
przez gęstość
(Twierdzenie 5.1).
Odpowiednio dobierając funkcję
możemy ,,przetwarzać” jedne rozkłady prawdopodobieństwa na inne, nowe.
Prawie wszystkie algorytmy generowania zmiennych losowych zawierają przekształcenia zmiennych losowych jako część składową. W niemal ,,czystej” postaci metoda przekształceń pojawiła się w algorytmie Boxa-Müllera, Przykładzie 3.4. Najważniejszym być może szczególnym przypadkiem metody przekształceń jest odwracanie dystrybuanty.
Faktycznie, ta metoda została już wykorzystana w Przykładzie 3.2.
Opiera się ona na prostym fakcie. Jeżeli jest ciągłą i ściśle rosnącą dystrybuantą,
i
, to
.
Następująca definicja funkcji ,,pseudo-odwrotnej” pozwala
pozbyć się kłopotliwych założeń.
Jeżeli jest dowolną dystrybuantą, to funkcję
określamy
wzorem:
![]() |
Nierówność jest równoważna
, dla dowolnych
i
.
Z prawostronnej ciągłości dystrybuanty wynika, że kres dolny w Definicji
3.1 jest osiągany, czyli
![]() |
Z drugiej strony,
![]() |
po prostu dlatego, że . Teza stwierdzenia natychmiast wynika z dwóch
nierówności powyżej.
Jeżeli i
, to
. W skrócie,
.
Na Rysunku 3.2 widać 20 punktów , które wylosowałem z rozkładu
(na osi pionowej) i odpowiadające im punkty
(na osi poziomej). W tym przypadku,
jest dystrybuantą rozkładu
(linia krzywa). Najważniejszy fragment kodu w R jest taki:
curve(pgamma(x,shape=3,rate=1), from=0,to=10) # rysowanie F
U <- runif(20);
X <- qgamma(U,shape=3,rate=1)
Zauważmy, że ta metoda działa również dla rozkładów dyskretnych i sprowadza się wtedy do metody ,,oczywistej”.
Załóżmy, że dla
i
.
Niech
,
. Jeżeli
jest dystrybuantą zmiennej
losowej
, to
![]() |
Odwracanie dystrybuanty ma ogromne znaczenie teoretyczne, bo jest całkowicie ogólną metodą generowania dowolnych zmiennych losowych jednowymiarowych. Może się to wydać dziwne, ale w praktyce ta metoda jest używana stosunkowo rzadko, z dwóch wzgłędów:
Obliczanie j bywa trudne i nieefektywne.
Stosowalność metody ogranicza się do zmiennych losowych jednowymiarowych.
Podam dwa przykłady, w których zastosowanie metody odwracanie dystrybuanty jest rozsądne
Z definicji, , jeśli
![]() |
dla . Odwrócenie dystrybuanty i generacja
są łatwe:
![]() |
Gęstość i dystrybuanta zmiennej są następujące:
![]() |
Można tę zmienną generować korzystająć z wzoru:
![]() |
To jest najważniejsza, najczęściej stosowana i najbardziej uniwersalna metoda. Zacznę od raczej oczywistego faktu, który jest w istocie probabilistycznym sformułowaniem definicji prawdopodobieństwa warunkowego.
Przypuśćmy, że jest ciągiem niezależnych zmiennych losowych o
jednakowym rozkładzie, o wartościach w przestrzeni
. Niech
będzie
takim zbiorem, że
. Niech
![]() |
Zmienne losowe i
są niezależne, przy tym
![]() |
zaś
![]() |
Wystarczy zauważyć, że
![]() |
W tym Stwierdzeniu może być dowolną przestrzenią mierzalną, zaś
i
– dowolnymi
zbiorami mierzalnymi. Stwierdzenie mówi po prostu, że prawdopodobieństwo warunkowe odpowiada
doświadczeniu losowemu powtarzanemu aż do momentu spełnienia warunku, przy
czym rezultaty poprzednich doświadczeń się ignoruje (stąd nazwa: eliminacja).
Zakładamy, że umiemy generować zmienne losowe o gęstości , a chcielibyśmy
otrzymać zmienną o gęstości proporcjonalnej do funkcji
. Zakładamy, że
.
repeat |
Gen ![]() |
Gen ![]() |
until ![]() |
![]() |
Na mocy Stwierdzenia 3.2, zastosowanego do zmiennych losowych
wystarczy pokazać, że
![]() |
(3.1) |
gdzie jest przestrzenią wartości zmiennej losowej
(i docelowej zmiennej losowej
).
Warunkujemy teraz przez wartości zmiennej
, otrzymując
![]() |
Skorzystaliśmy z niezależności i
oraz ze wzoru na prawdopodobieństwo całkowite. Otrzymaliśmy
licznik we wzorze (3.1). Mianownik dostaniemy zastępując
przez
.
Ważną zaletą algorytmu jest to, że nie trzeba znać ,,stałej normującej” gęstości , czyli
liczby
.
W istocie może być ogólną przestrzenią z miarą
. Żeby poczuć się pewniej
założę, że
jest przestrzenią polską i miara
jest
-skończona.
Możemy rozważać
gęstości i całki względem miary
– dowód poprawości algorytmu eliminacji
nie ulega zmianie. Nie widzę wielkiego sensu w przeładowaniu notacji,
można się umówić, że symbol
jest skrótem
.
Dociekliwy Czytelnik powinien zastanowić się, w jakiej sytuacji potrafi uzasadnić wszystkie
przejścia w dowodzie, powołując się na odpowiednie własności prawdopodobieństwa warunkowego
(np. twierdzenie o prawdopodobieństwie całkowitym itp.).
W każdym razie, algorytm eliminacji działa poprawnie, gdy
, gęstości są względem miary Lebesgue'a;
dyskretna, gęstości są względem miary liczącej.
Efektywność algorytmu zależy od dobrania gęstości tak, aby majoryzowała funkcję
ale nie
była dużo od niej większa.
Istotnie, liczba prób
do zaakceptowania
ma rozkład geometryczny z
prawdopodobieństwem sukcesu
, zgodnie ze Stwierdzeniem 3.2,
zatem
. Iloraz
powinien być możliwie bliski jedynki, co jest możliwe jeśli
,,kształt funkcji
jest podobny do
.
Zwykle metoda eliminacji stosuje się w połączeniu z odpowiednio dobranymi przekształceniami. Zilustrujmy to na poniższym przykładzie.
Niech i
będą niezależnymi zmiennymi losowymi o rozkładzie jednostajnym
. Pod warunkiem, że
zmienna losowa
ma gęstość
proporcjonalną do funkcji
.
Zmienna losowa
ma gęstość
.
Zatem
ma rozkład
.
Algorytm jest więc następujący:
repeat |
Gen ![]() |
![]() ![]() |
until ![]() |
return ![]() |
Efektywność tego algorytmu jest tym większa, im mniejsze są parametry
i
(frakcja zakceptowanych
jest wtedy duża).
Dla ilustracji rozpatrzmy dwa przypadki.
Na rysunku 3.3, po lewej stronie . Spośród
punktów zaakceptowano
.
Przerywana krzywa jest wykresem gęstości rozkładu
.
Po prawej stronie
,
. Spośród
punktów zaakceptowano tylko
. Tym razem wykres pokazuje gęstość rozkładu
.
Zaakceptowane punkty
(o gęstości
) są widoczne w postaci ,,kreseczek” na górnych rysunkach. Ciągłą linią jest narysowana
funkcja
.
Zasadniczy algorytm eliminacji opisany w Stwierdzeniu 3.2 i w Punkcie 3.3.1 polega na powtarzaniu generacji
tak długo, aż zostanie spełnione kryterium akceptacji. Liczba prób jest losowa, a rezultatem jest jedna zmienna losowa o zadanym rozkładzie.
Specyfika języka R narzuca inny sposób przeprowadzania eliminacji. Działamy na wektorach, a więc od razu produkujemy niezależnych zmiennych
o rozkładzie
, następnie poddajemy je wszystkie procedurze eliminacji. Przez sito eliminacji, powiedzmy
,
przechodzi pewna część zmiennych. Otrzymujemy losową liczbę zmiennych o rozkładzie proporcjonalnym do
. Liczba zaakceptowanych zmiennych
ma oczywiście rozkład dwumianowy
z
. To nie jest zbyt eleganckie.
W sztuczny sposób można zmusić R do wyprodukowania zadanej, nielosowej liczby zaakceptowanych zmiennych,
ale jeśli nie ma specjalnej konieczności, lepiej tego nie robić (przymus rzadko prowadzi do pozytywnych rezultatów).
Dla przykładu, generowanie zmiennych o rozkładzie jesnostajnym na kole
może w praktyce wyglądać tak:
> n <- 1000 > X <- runif(n,min=-1,max=1) \# generowanie z rozkładu jednostajnego na [-1,1] > Y <- runif(n,min=-1,max=1) > Accept <- X^2+Y^2<1 \# wektor logiczny > X <- X[Accept] > Y <- Y[Accept]
Otrzymujemy pewną losową liczbę (około 785) punktów w kole jednostkowym.
Jest to niezwykle prosta technika generowania zmiennych losowych. Załóżmy, że docelowy rozkład jest mieszanką prostszych rozkładów prawdopodobieństwa, czyli jego gęstość jest kombinacją wypukłą postaci
![]() |
Jeśli umiemy losować z każdej gęstości to możemy uruchomić dwuetapowe losowanie:
Gen ![]() ![]() |
Gen ![]() ![]() ![]() |
return ![]() |
Rozkład Laplace'a (podwójny rozkład wykładniczy) ma gęstość
![]() |
Można go ,,skomponować” z dwóch połówek rozkładu wykładniczego:
Gen ![]() |
Gen ![]() |
if ![]() ![]() ![]() |
return ![]() |
Treść automatycznie generowana z plików źródłowych LaTeXa za pomocą oprogramowania wykorzystującego LaTeXML.
strona główna | webmaster | o portalu | pomoc
© Wydział Matematyki, Informatyki i
Mechaniki UW, 2009-2010. Niniejsze materiały są udostępnione bezpłatnie na licencji Creative Commons Uznanie autorstwa-Użycie niekomercyjne-Bez utworów zależnych 3.0 Polska.
Projekt współfinansowany przez Unię Europejską w ramach
Europejskiego Funduszu Społecznego.
Projekt współfinansowany przez Ministerstwo Nauki i Szkolnictwa Wyższego i przez Uniwersytet Warszawski.