Ich möchte Samples aus der hier definierten blauen Region generieren:
Die naive Lösung besteht darin, eine Zurückweisungsabtastung im Einheitenquadrat zu verwenden, dies liefert jedoch nur einen Wirkungsgrad von (~ 21,4%).
Gibt es eine Möglichkeit, wie ich effizienter probieren kann?
probability
sampling
monte-carlo
random-generation
Cam.Davidson.Pilon
quelle
quelle
Antworten:
Reichen zwei Millionen Punkte pro Sekunde aus?
Die Verteilung ist symmetrisch: Wir müssen die Verteilung nur für ein Achtel des vollen Kreises berechnen und dann um die anderen Oktanten kopieren. In Polarkoordinaten ist die kumulative Verteilung des Winkels Θ für den zufälligen Ort ( X , Y ) beim Wert θ durch die Fläche zwischen den Dreiecken ( 0 , 0 ) , ( 1 , 0 ) , ( 1 , tan θ ) und der Kreisbogen von (( r , θ ) Θ ( X, Y) θ (0,0),(1,0),(1,tanθ) bis ( cos θ , sin θ ) . Es ist dabei proportional zu(1,0) (cosθ,sinθ)
woher seine Dichte ist
Wir können aus dieser Dichte beispielsweise eine Rückweisungsmethode (mit einem Wirkungsgrad von ) entnehmen .8/π−2≈54.6479%
Die bedingte Dichte der Radialkoordinate ist proportional zu r d r zwischen r = 1 und r = sec θ . Das kann mit einer einfachen Inversion der CDF abgetastet werden.R rdr r=1 r=secθ
Wenn wir unabhängige Abtastwerte erzeugen , tastet die Umwandlung in kartesische Koordinaten ( x i , y i ) diesen Oktanten ab. Da die Abtastwerte unabhängig sind, wird durch zufälliges Vertauschen der Koordinaten je nach Wunsch ein unabhängiger Zufallsabtastwert aus dem ersten Quadranten erzeugt. (Für die zufälligen Auslagerungen muss nur eine einzige Binomialvariable generiert werden, um zu bestimmen, wie viele Realisierungen ausgetauscht werden müssen.)(ri,θi) (xi,yi)
Jede solche Realisierung von erforderlich ist , im Durchschnitt einer einheitlichen Veränderlichen (für R ) sowie 1 / ( 8 π - 2 ) mal zwei einheitliches variates (für Θ ) und eine geringe Menge (schnell) Berechnung. Das sind 4 / ( π - 4 ) ≈ 4,66 Variationen pro Punkt (der natürlich zwei Koordinaten hat). Vollständige Details finden Sie im folgenden Codebeispiel. Diese Zahl zeigt 10.000 von mehr als einer halben Million generierten Punkten.(X,Y) R 1 / ( 8 π- 2 ) Θ 4 / ( π- 4 ) ≈ 4.66
Hier ist der
R
Code, der diese Simulation erstellt und zeitgesteuert hat.quelle
Ich schlage die folgende Lösung vor, die einfacher, effizienter und / oder rechnerisch billiger sein sollte als andere Lösungen von @cardinal, @whuber und @ stephan-kolassa.
Es umfasst die folgenden einfachen Schritte:
1) Zeichnen Sie zwei einheitliche Standardproben:
2a) Wende die folgende Scherumwandlung auf den Punkt (Punkte im unteren rechten Dreieck werden zum oberen linken Dreieck reflektiert und sie werden "nicht reflektiert" in 2b): [ x y ] = [ 1 1 ] + [ √min { u1, u2} , max { u1, u2}
2b) Vertausche und y, wenn u 1 > u 2 .x y u1> u2
3) Die Probe ablehnen, wenn sie sich innerhalb des Einheitskreises befindet (die Akzeptanz sollte bei 72% liegen), dh:
Die Intuition hinter diesem Algorithmus ist in der Abbildung dargestellt.
Die Schritte 2a und 2b können zu einem einzigen Schritt zusammengefasst werden:
2) Scherumwandlung anwenden und x = 1 + √ tauschen
Der folgende Code implementiert den obigen Algorithmus (und testet ihn mit @ whubers Code).
Einige Schnelltests ergeben die folgenden Ergebnisse.
Algorithmus /stats//a/258349 . Best of 3: 0,33 Sekunden pro Million Punkte.
Dieser Algorithmus. Best of 3: 0,18 Sekunden pro Million Punkte.
quelle
Gut, effizienter geht es nicht, aber ich hoffe, Sie suchen nicht schneller .
Wolfram hilft Ihnen dabei, das zu integrieren :
Sie können die CDF-Inversion wahrscheinlich erheblich beschleunigen, wenn Sie ein wenig nachdenken. Andererseits tut das Denken weh. Ich persönlich würde für die Ablehnung Sampling gehen, die schneller ist und weniger fehleranfällig, es sei denn , ich hatte sehr gute Gründe , nicht zu tun .
quelle