Zufallszahlen aus der Beta-Distribution, C ++

8

Ich habe eine Simulation in C ++ geschrieben, die (1.000.000) ^ 2 Zahlen aus einer bestimmten Wahrscheinlichkeitsverteilung erzeugt und dann etwas damit macht. Bisher habe ich Exponential-, Normal-, Gamma-, Uniform- und Poisson-Verteilungen verwendet. Hier ist der Code für einen von ihnen:

%Vor%

Jetzt muss ich es für die Beta-Distribution ausführen. Alle Verteilungen, die ich bisher gemacht habe, dauerten 10-15 Stunden. Die Beta-Distribution befindet sich nicht im boost / random-Paket, daher musste ich das boost / math / vertitions-Paket verwenden. Ich fand diese Seite auf StackOverflow , die eine Lösung vorschlug . Hier ist es (Kopieren-Einfügen):

%Vor%

Ich habe es repliziert und es hat funktioniert. Die Laufzeitschätzungen meiner Simulation sind linear und genau vorhersagbar. Sie sagen, dass dies für 25 Tage laufen wird. Ich sehe zwei Möglichkeiten: 1. Die vorgeschlagene Methode ist schlechter als die, die ich zuvor für andere Distributionen verwendet habe 2. Die Beta-Verteilung ist nur viel schwieriger, Zufallszahlen aus

zu generieren

Denken Sie daran, dass ich nur ein minimales Verständnis von C ++ - Programmierung habe, daher könnten die Fragen, die ich stelle, albern sein. Ich kann nicht einen Monat warten, bis diese Simulation abgeschlossen ist. Gibt es also etwas, was ich tun kann, um das zu verbessern? Vielleicht verwende ich die ursprüngliche Methode, die ich verwendet habe, und modifiziere sie, um mit dem boost / math / distributions-Paket zu arbeiten? Ich weiß nicht einmal, ob das möglich ist.

Eine weitere nützliche Information ist, dass die Parameter für alle (1.000.000) ^ 2 der Zahlen, die ich erzeugen muss, gleich sind. Ich sage das, weil die Beta-Distribution ein böses PDF hat und vielleicht das Wissen, dass die Parameter behoben sind, irgendwie verwendet werden kann, um den Prozess zu vereinfachen? Nur eine zufällige Schätzung.

    
jaff 27.04.2012, 21:23
quelle

3 Antworten

5

Die Beta-Verteilung hängt mit der Gamma-Verteilung zusammen. Sei X eine Zufallszahl aus Gamma (α, 1) und Y aus Gamma (β, 1), wobei das erste Argument für die Gammaverteilung der Formparameter ist. Dann hat Z = X / (X + Y) die Verteilung Beta (α, β). Mit dieser Umwandlung sollte es nur doppelt so lange dauern wie Ihr Gammaverteilungstest.

Hinweis: Das obige Beispiel nimmt die häufigste Darstellung der Gamma-Verteilung, Gamma (Form, Skalierung), an. Beachten Sie, dass verschiedene Implementierungen des Zufallsgenerators für die Gammaverteilung je nach Bedeutung und Reihenfolge der Argumente variieren.

    
David Hammen 27.04.2012, 23:13
quelle
2

Wenn Sie eine Verteilung wollen, die sehr Beta-ähnlich ist, aber eine sehr einfache geschlossene Inverse CDF hat, sollten Sie die Kumaraswamy-Verteilung in Betracht ziehen:

Ссылка

Es wird als Alternative zur Beta-Verteilung verwendet, wenn eine große Anzahl von Stichproben schnell benötigt wird.

    
FuzzyDuck 10.07.2014 17:12
quelle
0

Versuchen Sie, mit der Optimierung zu kompilieren. Das Verwenden eines Flags -O3 beschleunigt normalerweise die Dinge. Siehe hierzu Post auf Optimierungsflags oder diese Übersicht für etwas mehr Details.

    
Rob Simpson 27.04.2012 21:43
quelle