Verwerfungsmethode
Die Verwerfungsmethode (auch Acceptance-Rejection-Verfahren; engl. rejection sampling) ist eine Methode, um aus gleichverteilten Zufallszahlen andere Wahrscheinlichkeitsverteilungen zu erzeugen. Sie geht auf John von Neumann zurück.[1] Sie kann genutzt werden, wenn die Inversion der Verteilungsfunktion nicht möglich oder zu aufwendig ist.
Idee
sei hierbei die Verteilungsfunktion der Verteilung, zu der Zufallszahlen erzeugt werden sollen. sei eine Hilfsverteilungsfunktion, zu der sich auf einfachem Weg – etwa über die Inversionsmethode – Zufallszahlen erzeugen lassen. Es seien ferner und die zugehörigen Dichten.
Um die Verwerfungsmethode anwenden zu können, muss zudem ein konstantes existieren, so dass für jedes erfüllt ist. Das wird benötigt, da die Fläche unter einer Dichtefunktion immer 1 ist. Ohne den Vorfaktor gäbe es deshalb zwangsläufig Stellen mit .
Seien nun Standardzufallszahlen und Zufallszahlen, die der Verteilungsfunktion genügen.
Dann genügt mit die Zufallszahl der Verteilungsfunktion . Man wartet gewissermaßen auf einen ersten Treffer, der unterhalb von liegt.
Anders gesagt: Es werden Zufallszahlen nach der Verteilungsfunktion erzeugt, und die Zahl wird jeweils mit der Wahrscheinlichkeit
akzeptiert (Acceptance), also dann, wenn erstmals ist. Die vorhergehenden Zufallszahlen werden dagegen verworfen (Rejection).
Einfaches Beispiel
Um eine Zufallszahl aus zu wählen, wobei jede Zahl mit der gleichen Wahrscheinlichkeit auftreten soll, kann man einen herkömmlichen Spielwürfel werfen. Erscheint eine 6, wirft man ein erneutes Mal. Meist wird aber bereits beim ersten Wurf eine Zahl zwischen 1 und 5 (einschließlich) erscheinen.
Implementierung
Programmiertechnisch wird die Verwerfungsmethode allgemein wie folgender Pseudocode realisiert:
function F_verteilte_Zufallszahl()
var x, u
repeat
x := G_verteilte_Zufallszahl()
u := gleichförmig_verteilte_Zufallszahl()
until u * k * g(x) < f(x)
return x
end
Der Erwartungswert für die Anzahl der Schleifendurchläufe ist (siehe unten, Effizienz).
Grafische Veranschaulichung
Man kann sich die Methode so vorstellen, dass in der xy-Ebene zwischen der x-Achse und dem Graph von gleichmäßig auf der Fläche verteilte Zufallspunkte verstreut werden. Als x-Koordinate des Punkts nimmt man die G-verteilte Zufallszahl , und die y-Koordinate erhält man aus der standardverteilten Zahl : .
Von diesen Zufallspunkten werden diejenigen verworfen, die oberhalb des Graphs von liegen (). Die x-Koordinaten der übrigen Punkte sind dann nach der Dichtefunktion verteilt.
Um eine Zufallszahl nach dieser Verteilung zu erzeugen, werden also solange neue Zufallspunkte erzeugt, bis einer unterhalb von liegt (im Bild der Punkt C). Dessen x-Koordinate ist die gesuchte Zufallszahl.
Effizienz
Die Fläche unter der Dichtefunktion ist 1, und unter ist die Fläche entsprechend . Deshalb müssen im Mittel Standardzufallszahlen und Zufallszahlen, die genügen, verbraucht werden, bis der erste Treffer erzielt wird. Daher ist es von Vorteil, wenn die Hilfsdichte die Dichte möglichst gut approximiert, damit man klein wählen kann.
Literatur
- Donald E. Knuth: The Art of Computer Programming. Volume 2: Seminumerical Algorithms. 3. Auflage. Addison-Wesley, Reading MA u. a. 1997, ISBN 0-201-89684-2, S. 120ff. (Addison-Wesley Series in Computer Science and Information Processing).
- Luc Devroye: Non-Uniform Random Variate Generation. (PDF; 758 kB) Springer-Verlag, New York NY u. a. 1986, ISBN 0-387-96305-7, S. 41ff.
Einzelnachweise
- John von Neumann: Various techniques used in connection with random digits. Monte Carlo methods. In: Nat. Bureau Standards, 12, 1951, S. 36–38.