Ostatnio przyglądałem się symulacji Monte Carlo i używałem jej do przybliżania stałych, takich jak (okrąg wewnątrz prostokąta, obszar proporcjonalny).
Nie jestem jednak w stanie wymyślić odpowiedniej metody aproksymacji wartości [liczby Eulera] przy użyciu integracji Monte Carlo.
Czy masz jakieś wskazówki, jak to zrobić?
simulation
monte-carlo
algorithms
random-generation
numerical-integration
statystyki newwbie12345
źródło
źródło
R
polecenie2 + mean(exp(-lgamma(ceiling(1/runif(1e5))-1)))
. (Jeśli przeszkadza Ci korzystanie z funkcji log Gamma, zastąp ją2 + mean(1/factorial(ceiling(1/runif(1e5))-2))
, która używa tylko dodawania, mnożenia, dzielenia i obcinania, i ignoruj ostrzeżenia o przepełnieniu). Bardziej interesujące mogą być wydajne symulacje: czy możesz zminimalizować liczbę kroki obliczeniowe potrzebne do oszacowaniaOdpowiedzi:
W tym artykule opisano prosty i elegancki sposób oszacowania przez Monte Carlo . Artykuł dotyczy nauczania . Dlatego podejście wydaje się idealnie pasować do twojego celu. Pomysł opiera się na ćwiczeniu z popularnego rosyjskiego podręcznika teorii prawdopodobieństwa autorstwa Gnedenko. Patrz przykład 22 na str. 183ee e
Zdarza się tak, że , gdzie jest zmienną losową, która jest zdefiniowana w następujący sposób. Jest to minimalna liczba taka, że i są liczbami losowymi z rozkładu równomiernego na . Piękne, prawda ?!ξ n ∑ n i = 1 r i > 1 r i [ 0 , 1 ]E[ξ]=e ξ n ∑ni=1ri>1 ri [0,1]
Ponieważ jest to ćwiczenie, nie jestem pewien, czy fajnie jest dla mnie opublikować rozwiązanie (dowód) tutaj :) Jeśli chcesz sam to udowodnić, oto wskazówka: rozdział nazywa się „Chwile”, które powinny wskazywać jesteś we właściwym kierunku.
Jeśli chcesz wdrożyć go samodzielnie, nie czytaj dalej!
Jest to prosty algorytm do symulacji Monte Carlo. Narysuj jednolity losowy, a następnie kolejny i tak dalej, aż suma przekroczy 1. Liczba losowanych losów jest twoją pierwszą próbą. Powiedzmy, że masz:
Potem twoja pierwsza próba sprawiła, że 3. Kontynuuj te próby, a zauważysz, że średnio dostajesz .e
Poniżej znajduje się kod MATLAB, wynik symulacji i histogram.
Wynik i histogram:
AKTUALIZACJA: Zaktualizowałem swój kod, aby pozbyć się szeregu wyników próbnych, aby nie zajmował pamięci RAM. Wydrukowałem również oszacowanie PMF.
Aktualizacja 2: Oto moje rozwiązanie Excel. Umieść przycisk w programie Excel i połącz go z następującym makrem VBA:
Wprowadź liczbę prób, na przykład 1000, w komórce D1 i kliknij przycisk. Oto jak powinien wyglądać ekran po pierwszym uruchomieniu:
AKTUALIZACJA 3: Silverfish zainspirował mnie do innej drogi, nie tak eleganckiej jak pierwsza, ale wciąż fajnej. Obliczył objętości n-simpleksów przy użyciu sekwencji Sobola .
Przypadkowo napisał pierwszą książkę o metodzie Monte Carlo, którą przeczytałem w szkole średniej. Moim zdaniem jest to najlepsze wprowadzenie do metody.
AKTUALIZACJA 4:
Silverfish w komentarzach sugerował prostą implementację formuły Excel. Taki wynik uzyskuje się po jego podejściu po około 1 milionie losowych liczb i 185 000 prób:
Oczywiście jest to znacznie wolniejsze niż wdrożenie Excel VBA. Zwłaszcza jeśli zmodyfikujesz mój kod VBA, aby nie aktualizować wartości komórek w pętli i zrobisz to dopiero po zebraniu wszystkich statystyk.
AKTUALIZACJA 5
Xi'an za rozwiązanie nr 3 jest ściśle powiązany (lub nawet taki sam w pewnym sensie jako komentarz na JWG w wątku). Trudno powiedzieć, kto wpadł na ten pomysł jako pierwszy Forsythe lub Gnedenko. Oryginalna edycja Gnedenko z 1950 roku w języku rosyjskim nie zawiera sekcji Problemy w rozdziałach. Tak więc nie mogłem znaleźć tego problemu na pierwszy rzut oka, gdzie jest w późniejszych wydaniach. Może został dodany później lub zakopany w tekście.
Jak skomentowałem w odpowiedzi Xi'ana, podejście Forsythe'a wiąże się z innym interesującym obszarem: rozkładem odległości między pikami (ekstrema) w losowych sekwencjach (IID). Średnia odległość zdarza się wynosić 3. Sekwencja dolna w podejściu Forsythe'a kończy się na dole, więc jeśli będziesz kontynuować próbkowanie, w pewnym momencie dostaniesz kolejne dno, a potem inne. Możesz śledzić odległość między nimi i zbudować rozkład.
źródło
Mean[Table[ Length[NestWhileList[(Random[]+#) &, Random[], #<1&]], {10^6}]]
R
rozwiązania, które zamieściłem w odpowiedzin=10^6; 1. / Mean[UnitStep[Differences[Sort[RandomReal[{0, n}, n + 1]]] - 1]]
Sugeruję, by głosować na odpowiedź Aksakala. Jest bezstronny i opiera się wyłącznie na metodzie generowania odchyleń jednostkowych jednostek.
Moja odpowiedź może być dowolnie sprecyzowana, ale nadal jest stronnicza od prawdziwej wartości .e
Odpowiedź Xi'ana jest poprawna, ale myślę, że jej zależność od funkcji lub sposobu generowania losowych odchyleń Poissona jest nieco okrągła, gdy celem jest przybliżenie .elog e
Oszacowanie przez ładowanie początkowee
Zamiast tego rozważ procedurę ładowania. Jeden ma dużą liczbę obiektów które są rysowane z zamianą na wielkość próbki . Przy każdym losowaniu prawdopodobieństwo nie rysowania określonego obiektu wynosi i jest takich losowań. Prawdopodobieństwo pominięcia określonego obiektu we wszystkich losowaniach wynosin i 1 - n - 1 n p = ( 1 - 1n n i 1−n−1 n p=(1−1n)n.
Ponieważ zakładam, że wiemy, że
więc możemy też napisać
Oznacza to, że nasze oszacowanie można znaleźć poprzez oszacowanie prawdopodobieństwa pominięcia konkretnej obserwacji w bootstrapie replikuje w wielu takich replikacjach - tj. występowania obiektu w bootstrapie.m B j ip m Bj i
Są dwa źródła błędów w tym przybliżeniu. Skończone zawsze oznacza, że wyniki są przybliżone, tj. Oszacowanie jest stronnicze. Dodatkowo będzie oscylować wokół prawdziwej wartości, ponieważ jest to symulacja.tn p^
Uważam to podejście za urocze, ponieważ student lub inna osoba z wystarczającą ilością rzeczy do zrobienia może przybliżyć za pomocą talii kart, stosu małych kamieni lub innych dostępnych przedmiotów, w tym samym stylu, co osoba może oszacować używając kompasu, prostej krawędzi i drobinek piasku. Myślę, że to fajne, kiedy matematykę można oddzielić od nowoczesnych udogodnień, takich jak komputery.πe π
Wyniki
Przeprowadziłem kilka symulacji dla różnej liczby replik ładowania początkowego. Standardowe błędy są szacowane w normalnych odstępach czasu.
Zauważ, że wybór liczby obiektów ładowanych początkowo ustanawia absolutną górną granicę dokładności wyników, ponieważ procedura Monte Carlo szacuje a zależy tylko od . Ustawienie niepotrzebnie dużej wartości tylko obciąży komputer, albo dlatego, że potrzebujesz tylko „przybliżonego” przybliżenia do albo dlatego, że odchylenie zostanie zatłoczone przez wariancję z powodu Monte Carlo. Te wyniki są dla a jest dokładne z dokładnością do trzeciego miejsca po przecinku.p p n n e n = 10 3 p - 1 ≈ en p p n n e n=103 p−1≈e
Ten wykres pokazuje, że wybór ma bezpośrednie i głębokie konsekwencje dla stabilności w . Niebieska linia przerywana pokazuje a czerwona linia pokazuje . Zgodnie z oczekiwaniami, zwiększenie wielkości próby daje coraz dokładniejsze szacunki . s t e sm p^ p e p^
Napisałem do tego żenująco długi skrypt R. Sugestie dotyczące ulepszeń można przesłać na odwrocie rachunku za 20 USD.
źródło
Rozwiązanie 1:
Dla Poissona dystrybucja Dlatego, jeśli , co oznacza, że możesz oszacować za pomocą symulacji Poissona. Symulacje Poissona można uzyskać z generatora rozkładu wykładniczego (jeśli nie w najbardziej efektywny sposób).P (P.( λ ) X ∼ P ( 1 ) P ( X = 0 ) = P ( X = 1 ) = e - 1 e - 1
Rozwiązanie 2:
Innym sposobem uzyskania reprezentacji stałej jako całki jest przypomnienie, że gdy to który jest również rozkładem . Dlatego Drugie podejście do przybliżenia przez Monte Carlo ma zatem symulować pary normalne i monitorować częstotliwość razy . W pewnym sensie jest to przeciwieństwo aproksymacji Monte Carlo związane z częstotliwością razy ...mi
Rozwiązanie 3:
Mój kolega z Uniwersytetu w Warwick, M. Pollock, wskazał inne przybliżenie Monte Carlo zwane metodą Forsythe'a : chodzi o to, by uruchomić sekwencję ujednoliconych generacji aż do . Oczekiwanie na odpowiednią regułę zatrzymania, , która jest liczbą przypadków, w których jednorodna sekwencja spadła, wynosi wtedy podczas gdy prawdopodobieństwo, że jest nieparzyste, wynosi ! ( Metoda Forsythe'a faktycznie ma na celu symulację z dowolnej gęstości formy , stąd jest bardziej ogólna niż przybliżenie i .)u n + 1 > u n N e N e - 1 exp G ( x ) e eu1,u2,... un+1>un N e N e−1 expG(x) e e−1
Szybka implementacja metody Forsythego R polega na rezygnacji z dokładnego wykonywania sekwencji mundurów na rzecz większych bloków, co pozwala na równoległe przetwarzanie:
źródło
n <- 1e5; 1/mean(n*diff(sort(runif(n+1))) > 1)
To nie rozwiązanie ... tylko szybki komentarz, który jest za długi na pole komentarza.
Aksakal
Aksakal opublikował rozwiązanie, w którym obliczamy oczekiwaną liczbę standardowych rysunków Uniform, które należy pobrać, tak aby ich suma przekroczyła 1. W Mathematica moim pierwszym sformułowaniem było:
EDYCJA: Właśnie się z tym pobawiłem, a następujący kod (ta sama metoda - także w Mma - tylko inny kod) jest około 10 razy szybszy:
Xian / Whuber
Whuber zasugerował szybki fajny kod do symulacji rozwiązania Xian 1:
Wersja R:
n <- 1e5; 1/mean(n*diff(sort(runif(n+1))) > 1)
Wersja Mma:
n=10^6; 1. / Mean[UnitStep[Differences[Sort[RandomReal[{0, n}, n + 1]]] - 1]]
który zauważa, że jest 20 razy szybszy niż pierwszy kod (lub około dwa razy szybciej niż nowy kod powyżej).
Dla zabawy pomyślałem, że byłoby interesujące sprawdzić, czy oba podejścia są tak skuteczne (w sensie statystycznym). W tym celu wygenerowałem 2000 oszacowań e przy użyciu:
... oba w Mathematica . Poniższy diagram porównuje nieparametryczne oszacowanie gęstości jądra wynikowych zestawów danych dataA i dataB.
Tak więc, chociaż kod Whubera (czerwona krzywa) jest około dwa razy szybszy, metoda nie wydaje się być „niezawodna”.
źródło
running four times as many iterations will make them equally accurate
Metoda wymagająca bezbożnej ilości próbek
Metoda wymagająca bardzo niewielu próbek, ale powodująca bezbożną ilość błędów numerycznych
Całkowicie głupia, ale bardzo skuteczna odpowiedź na podstawie mojego komentarza:
To zbiegnie się bardzo szybko, ale również napotka ekstremalny błąd numeryczny.
źródło
Oto inny sposób, w jaki można to zrobić, choć jest on dość wolny. Nie rości sobie pretensji do skuteczności, ale oferuję tę alternatywę w duchu kompletności.
Implementacja w R: Metodę można zaimplementować przy
R
użyciurunif
do generowania jednolitych wartości. Kod jest następujący:źródło