Ich habe mir kürzlich die Monte-Carlo-Simulation angesehen und sie verwendet, um Konstanten wie (Kreis in einem Rechteck, proportionale Fläche) anzunähern.
Ich kann mir jedoch keine entsprechende Methode vorstellen, um den Wert von [Eulers Zahl] mithilfe der Monte-Carlo-Integration zu approximieren .
Haben Sie Hinweise, wie dies getan werden kann?
simulation
monte-carlo
algorithms
random-generation
numerical-integration
statisticnewbie12345
quelle
quelle
R
Befehl2 + mean(exp(-lgamma(ceiling(1/runif(1e5))-1)))
tut. (Wenn Sie die Gamma-Protokollfunktion stören, ersetzen Sie diese durch2 + mean(1/factorial(ceiling(1/runif(1e5))-2))
Addition, Multiplikation, Division und Trunkierung und ignorieren Sie die Überlaufwarnungen.) Was von größerem Interesse sein könnte, wären effiziente Simulationen: Können Sie die Anzahl minimieren ? Rechenschritte erforderlich, um mit einer bestimmten Genauigkeit abzuschätzen ?Antworten:
Die einfache und elegante Art, nach Monte Carlo zu schätzen, wird in diesem Artikel beschrieben . In der Arbeit geht es eigentlich um das Unterrichten von . Daher scheint der Ansatz perfekt zu Ihrem Ziel zu passen. Die Idee basiert auf einer Übung aus einem beliebten russischen Lehrbuch zur Wahrscheinlichkeitstheorie von Gnedenko. Siehe Beispiel 22 auf S.183ee e
Es passiert also, dass , wobei eine Zufallsvariable ist, die wie folgt definiert ist. Es ist die minimale Anzahl von so dass und Zufallszahlen aus der Gleichverteilung von . Schön, nicht wahr ?!ξ n ∑ n i = 1 r i > 1 r i [ 0 , 1 ]E[ξ]=e ξ n ∑ni = 1rich> 1 rich [ 0 , 1 ]
Da es sich um eine Übung handelt, bin ich mir nicht sicher, ob es für mich cool ist, die Lösung (Beweis) hier zu posten :) Wenn Sie es selbst beweisen möchten, hier ein Tipp: Das Kapitel heißt "Momente", was darauf hindeuten sollte Sie in die richtige Richtung.
Wenn Sie es selbst implementieren möchten, lesen Sie nicht weiter!
Dies ist ein einfacher Algorithmus für die Monte-Carlo-Simulation. Ziehe einen einheitlichen Zufallsgenerator, dann einen weiteren und so weiter, bis die Summe 1 übersteigt. Die Anzahl der gezogenen Zufälle ist dein erster Versuch. Angenommen, Sie haben:
Dann wurde Ihre erste Testversion gerendert. 3. Führen Sie diese Testversionen weiter aus, und Sie werden feststellen, dass Sie im Durchschnitt .e
MATLAB-Code, Simulationsergebnis und das Histogramm folgen.
Das Ergebnis und das Histogramm:
UPDATE: Ich habe meinen Code aktualisiert, um die Reihe der Testergebnisse zu entfernen, sodass kein RAM benötigt wird. Ich habe auch die PMF-Schätzung ausgedruckt.
Update 2: Hier ist meine Excel-Lösung. Fügen Sie eine Schaltfläche in Excel ein und verknüpfen Sie sie mit dem folgenden VBA-Makro:
Geben Sie die Anzahl der Versuche (z. B. 1000) in die Zelle D1 ein und klicken Sie auf die Schaltfläche. So sollte der Bildschirm nach dem ersten Lauf aussehen:
UPDATE 3: Silverfish hat mich auf eine andere Art inspiriert, nicht so elegant wie die erste, aber trotzdem cool. Es berechnete das Volumen von n-Simplexen unter Verwendung von Sobol- Sequenzen.
Zufällig schrieb er das erste Buch über die Monte-Carlo-Methode, das ich in der High School gelesen hatte. Meiner Meinung nach ist dies die beste Einführung in die Methode.
UPDATE 4:
Silverfish schlug in Kommentaren eine einfache Implementierung von Excel-Formeln vor. Dies ist die Art von Ergebnis, die Sie mit seiner Herangehensweise nach insgesamt 1 Million Zufallszahlen und 185K-Versuchen erhalten:
Dies ist offensichtlich viel langsamer als die Implementierung von Excel VBA. Insbesondere, wenn Sie meinen VBA-Code so ändern, dass die Zellenwerte in der Schleife nicht aktualisiert werden und erst dann aktualisiert werden, wenn alle Statistiken erfasst wurden.
UPDATE 5
Xi'ans Lösung Nr. 3 ist eng miteinander verwandt (oder in gewisser Weise sogar mit jwgs Kommentar im Thread identisch). Es ist schwer zu sagen, wer zuerst Forsythe oder Gnedenko auf die Idee kam. Gnedenkos Originalausgabe von 1950 in russischer Sprache enthält keine Abschnitte mit Problemen in Kapiteln. So konnte ich dieses Problem auf den ersten Blick nicht finden, wo es in späteren Ausgaben ist. Vielleicht wurde es später hinzugefügt oder im Text vergraben.
Wie ich in Xi'ans Antwort bemerkte, ist Forsythes Ansatz mit einem anderen interessanten Bereich verbunden: der Verteilung der Abstände zwischen Spitzen (Extrema) in zufälligen (IID) Sequenzen. Der mittlere Abstand ist zufällig 3. Die Abwärtssequenz in Forsythes Ansatz endet mit einem Boden. Wenn Sie also mit dem Abtasten fortfahren, erhalten Sie irgendwann einen anderen Boden, dann einen anderen usw. Sie könnten den Abstand zwischen ihnen verfolgen und die Verteilung aufbauen.
quelle
Mean[Table[ Length[NestWhileList[(Random[]+#) &, Random[], #<1&]], {10^6}]]
R
Lösung, die ich in Xi'ans Antwort gepostet habe, ist zwanzigmal schneller:n=10^6; 1. / Mean[UnitStep[Differences[Sort[RandomReal[{0, n}, n + 1]]] - 1]]
Ich schlage vor, Aksakals Antwort zu unterstützen. Es ist unvoreingenommen und stützt sich nur auf ein Verfahren zur Erzeugung einheitlicher Abweichungen.
Meine Antwort kann willkürlich präzisiert werden, ist aber immer noch vom wahren Wert von .e
Xi'ans Antwort ist richtig, aber ich denke, dass seine Abhängigkeit von der Funktion oder einer Methode zur Erzeugung von Poisson-Zufallsabweichungen ein wenig kreisförmig ist, wenn der Zweck darin besteht, e anzunähern .Log e
Schätzung von durch Bootstrappinge
Betrachten Sie stattdessen das Bootstrapping-Verfahren. Man hat eine große Anzahl von Objekten die beim Ersetzen auf eine Stichprobengröße von n gezeichnet werden . Bei jeder Ziehung beträgt die Wahrscheinlichkeit , ein bestimmtes Objekt i nicht zu zeichnen, 1 - n - 1 , und es gibt n solche Ziehungen. Die Wahrscheinlichkeit, dass ein bestimmtes Objekt in allen Ziehungen weggelassen wird, ist p = ( 1 - 1n n ich 1 - n- 1 n p = ( 1 - 1n)n.
so können wir auch schreiben
Das heißt, unsere Schätzung von ergibt sich aus der Schätzung der Wahrscheinlichkeit, dass eine bestimmte Beobachtung in Bootstrap-Replikaten über viele solcher Replikate hinweg unterbleibt - dh dem Anteil des Auftretens von Objekt in den Bootstraps.m B j ip m Bj ich
Bei dieser Annäherung gibt es zwei Fehlerquellen. Endliches immer, dass die Ergebnisse ungefähr sind, dh die Schätzung ist verzerrt. Außerdem schwankt um den wahren Wert, da dies eine Simulation ist.pn p^
Ich finde diesen Ansatz etwas charmant , weil ein Student oder eine andere Person mit ausreichend wenig zu tun annähern könnte mit einem Deck von Karten, einen Haufen von kleinen Steinen oder andere Gegenständen in der Hand, in der gleichen Richtung wie eine Person schätzen , könnte mit einem Kompass, einer geraden Kante und ein paar Sandkörnern. Ich finde es gut, wenn Mathematik von modernen Annehmlichkeiten wie Computern getrennt werden kann.πe π
Ergebnisse
Ich habe mehrere Simulationen für verschiedene Anzahl von Bootstrap-Replikationen durchgeführt. Standardfehler werden in normalen Intervallen geschätzt.
Beachten Sie, dass die Auswahl von die Anzahl der Objekte, die gebootet werden, eine absolute Obergrenze für die Genauigkeit der Ergebnisse darstellt, da die Monte-Carlo-Prozedur schätzt und nur von abhängt . Wenn Sie unnötig groß einstellen, belastet dies nur Ihren Computer, entweder weil Sie nur eine "grobe" Annäherung an benötigen oder weil die Abweichung aufgrund des Monte-Carlo-Effekts überlastet wird. Diese Ergebnisse sind für und auf die dritte Dezimalstelle genau.p p n n e n = 10 3 p - 1 ≈ en p p n n e n = 103 p- 1≈ e
Diese Darstellung zeigt, dass die Wahl von direkte und tiefgreifende Konsequenzen für die Stabilität in . Die blaue gestrichelte Linie zeigt und die rote Linie zeigt . Wie erwartet, erzeugt die Probengröße zu erhöhen immer genauere Schätzungen . p p e pm p^ p e p^
Ich habe dafür ein peinlich langes R-Skript geschrieben. Verbesserungsvorschläge können auf der Rückseite einer 20-Dollar-Rechnung eingereicht werden.
quelle
Lösung 1:
Lösung 2:
Lösung 3:
Eine schnelle R-Implementierung der Forsythe-Methode besteht darin, die Reihenfolge der Uniformen zugunsten größerer Blöcke genau einzuhalten, was eine parallele Verarbeitung ermöglicht:
quelle
n <- 1e5; 1/mean(n*diff(sort(runif(n+1))) > 1)
Keine Lösung ... nur ein kurzer Kommentar, der für das Kommentarfeld zu lang ist.
Aksakal
Aksakal veröffentlichte eine Lösung, in der wir die erwartete Anzahl der zu erstellenden einheitlichen Standardzeichnungen so berechnen, dass ihre Summe 1 übersteigt. In Mathematica lautete meine erste Formulierung:
EDIT: Hatte gerade ein schnelles Spiel damit und der folgende Code (gleiche Methode - auch in Mma - nur anderer Code) ist ungefähr 10-mal schneller:
Xian / Whuber
Whuber hat schnellen coolen Code vorgeschlagen, um Xians Lösung 1 zu simulieren:
R-Version:
n <- 1e5; 1/mean(n*diff(sort(runif(n+1))) > 1)
Mma-Version:
n=10^6; 1. / Mean[UnitStep[Differences[Sort[RandomReal[{0, n}, n + 1]]] - 1]]
was er feststellt, ist 20 mal schneller als der erste Code (oder etwa doppelt so schnell wie der neue Code oben).
Nur zum Spaß dachte ich, es wäre interessant zu sehen, ob beide Ansätze (im statistischen Sinne) so effizient sind. Zu diesem Zweck habe ich 2000 Schätzungen für e erstellt, in denen Folgendes verwendet wurde:
... beides in Mathematica . Das folgende Diagramm stellt eine nichtparametrische Schätzung der Kerneldichte der resultierenden Datensätze dataA und dataB gegenüber.
Obwohl Whubers Code (rote Kurve) etwa doppelt so schnell ist, scheint die Methode nicht so zuverlässig zu sein.
quelle
running four times as many iterations will make them equally accurate
Methode, die eine gottlose Menge an Proben erfordert
Wenn Sie total verrückt werden wollen, können Sie sogar schätzen2–√ 2π−−√
Methode, die nur sehr wenige Stichproben erfordert, aber eine gottlose Menge an numerischen Fehlern verursacht
Eine völlig dumme, aber sehr effiziente Antwort, die auf einem Kommentar basiert, den ich abgegeben habe:
Dies wird sehr schnell konvergieren , aber auch auf extreme numerische Fehler stoßen.
quelle
Hier ist eine andere Möglichkeit, es zu tun, obwohl es ziemlich langsam ist. Ich mache keinen Anspruch auf Effizienz, biete diese Alternative aber im Sinne der Vollständigkeit an.
Implementierung in R: Die Methode kann implementiert werden,
R
indemrunif
einheitliche Werte generiert werden. Der Code lautet wie folgt:quelle