Czy ktoś może mi powiedzieć, jak symulować , gdzie , za pomocą rzutu monetą (tyle razy, ile potrzebujesz) z ?
Myślałem o użyciu próbkowania odrzucenia, ale nie mogłem tego dopracować.
Czy ktoś może mi powiedzieć, jak symulować , gdzie , za pomocą rzutu monetą (tyle razy, ile potrzebujesz) z ?
Myślałem o użyciu próbkowania odrzucenia, ale nie mogłem tego dopracować.
Odpowiedzi:
Ponieważ istnieje niezliczona ilość rozwiązań, znajdźmy skuteczne .
Idea tego zaczyna się od standardowego sposobu implementacji zmiennej Bernoulliego: porównaj jednolitą zmienną losową do parametru . Kiedy, powrót ; w przeciwnym razie wróć.
Możemy użyć -coin jako jednolity generator liczb losowych . Aby wygenerować liczbę równomiernie w dowolnym przedziale czasowym , rzuć monetą. Kiedy jest to głowa, rekurencyjnie generuj jednolitą wartość na początku część przedziału; gdy są to ogony, generuj rekurencyjnie od ostatniego część przedziału. W pewnym momencie przedział docelowy stanie się tak mały, że tak naprawdę nie ma znaczenia, jak wybierzesz z niego liczbę: tak zaczyna się rekurencja. Oczywiste jest, że ta procedura generuje jednolite zmienne (do dowolnej pożądanej precyzji), co łatwo udowodnić indukcyjnie.
Ten pomysł nie jest skuteczny, ale prowadzi do wydajnej metody. Ponieważ na każdym etapie będziesz losować liczbę z określonego przedziału, dlaczego najpierw nie sprawdzić, czy trzeba go narysować? Jeśli wartość docelowa leży poza tym przedziałem, znasz już wynik porównania między wartością losową a wartością docelową. Dlatego algorytm ten szybko się kończy. (Można to interpretować jako procedurę próbkowania odrzucenia wymaganą w pytaniu.)
Możemy dalej optymalizować ten algorytm. Na każdym etapie faktycznie mamy dwie monety, których możemy użyć: poprzez zmianę etykiety naszej monety możemy przekształcić ją w monetę, która jest szansą. Dlatego jako wstępne obliczenie możemy rekurencyjnie wybrać, które ponowne etykietowanie prowadzi do niższej oczekiwanej liczby przerzutów potrzebnych do zakończenia. (To obliczenie może być kosztownym krokiem.)
Na przykład nieefektywne jest używanie monety naśladować Bernoulliegozmienna bezpośrednio: średnio zajmuje prawie dziesięć rzutów. Ale jeśli użyjemy monetą, to już po dwóch rzutach na pewno się zakończymy, a oczekiwana liczba rzutów jest po prostu .
Oto szczegóły.
Podziel dowolny podany półotwarty przedział w odstępach
To definiuje dwie transformacje i które działają w okresach półotwartych.
Jeśli chodzi o terminologię, jeśli to dowolny zestaw liczb rzeczywistych, niech wyrażenie
znaczy że jest dolną granicą dla : dla wszystkich . Podobnie, znaczy jest górną granicą dla .
pisać . (W rzeczywistości nie ma znaczenia, czyjest rzeczywisty zamiast racjonalnego; wymagamy tylko tego.)
Oto algorytm tworzenia wariacji z żądanym parametrem Bernoulli:
Zestaw i .
Podczas {Rzuć monetą, aby wyprodukować . Zestaw Przyrost .}
Gdyby następnie ustaw . W przeciwnym razie ustaw.
Aby to zilustrować, oto R
implementacja alorithm jako funkcji draw
. Jego argumenty są wartością docelową i interwał , początkowo . Wykorzystuje s
implementację funkcji pomocniczej. Chociaż nie musi, śledzi także liczbę rzutów monetą. Zwraca losową zmienną, liczbę rzutów i ostatni sprawdzony interwał.
s <- function(x, ab, p) {
d <- diff(ab) * p
if (x == 1) c(ab[1], ab[1] + d) else c(ab[1] + d, ab[2])
}
draw <- function(target, p) {
between <- function(z, ab) prod(z - ab) <= 0
ab <- c(0,1)
n <- 0
while(between(target, ab)) {
n <- n+1; ab <- s(runif(1) < p, ab, p)
}
return(c(target > ab[2], n, ab))
}
Jako przykład jego zastosowania i sprawdzenia jego dokładności weźmy przykład i . Porysujmy wartości przy użyciu algorytmu, zgłaszają średnią (i jej błąd standardowy) oraz wskazują średnią liczbę zastosowanych przerzutów.
target <- 0.01
p <- 0.9
set.seed(17)
sim <- replicate(1e4, draw(target, p))
(m <- mean(sim[1, ])) # The mean
(m - target) / (sd(sim[1, ]) / sqrt(ncol(sim))) # A Z-score to compare to `target`
mean(sim[2, ]) # Average number of flips
W tej symulacji klapki były główkami. Chociaż niższy niż cel, wynik Z na poziomie nie jest znaczący: to odchylenie można przypisać przypadkowi. Średnia liczba przerzutów wyniosła- trochę mniej niż dziesięć. Gdybyśmy skorzystali z monety, średnia byłaby - nadal nie różni się znacząco od celu, ale tylko przerzuty byłyby potrzebne średnio.
Oto rozwiązanie (trochę niechlujne, ale to moje pierwsze dźgnięcie). Możesz faktycznie zignorować i WLOG zakłada . Dlaczego? Istnieje sprytny algorytm do generowania obiektywnego rzutu monetą z dwóch stronniczych rzutów monetą. Możemy więc założyć.
Aby wygenerować , Mogę wymyślić dwa rozwiązania (pierwsze nie jest moje, ale drugie jest uogólnieniem):
Odwróć obiektywną monetę czasy. Gdybygłowy nie są obecne, zacznij od nowa. Gdybygłowice są obecne, zwróć, czy pierwsza moneta jest głowicą, czy nie (ponieważ)
Można to rozszerzyć na dowolną wartość . pisaćw formie binarnej. Na przykład,
Stworzymy nowy numer binarny za pomocą rzutów monetą. Zacząć odi dodawaj cyfry w zależności od tego, czy pojawią się głowice (1) czy ogony (0). Przy każdym odwróceniu porównaj swój nowy numer binarny z reprezentacją binarną do tej samej cyfry . W końcu obie się rozejdą i wrócą, jeśli jest większy niż liczba binarna.
W Pythonie:
def simulate(p):
binary_p = float_to_binary(p)
binary_string = '0.'
index = 3
while True:
binary_string += '0' if random.random() < 0.5 else '1'
if binary_string != binary_p[:index]:
return binary_string < binary_p[:index]
index += 1
Niektóre dowody:
np.mean([simulate(0.4) for i in range(10000)])
wynosi około 0,4 (jednak nie szybko)
Widzę proste rozwiązanie, ale bez wątpienia istnieje wiele sposobów na zrobienie tego, niektóre prawdopodobnie łatwiejsze niż to. To podejście można podzielić na dwa etapy:
Generowanie z dwóch zdarzeń z jednakowym prawdopodobieństwem przy nieuczciwej procedurze losowania monet (połączenie konkretnej monety i metody jej rzucania generuje głowę z prawdopodobieństwem ). Możemy nazwać te dwa równie prawdopodobne zdarzenia, i . [Jest na to proste podejście, które wymaga pary rzutów i aby uzyskać dwa równie prawdopodobne wyniki, przy czym wszystkie inne wyniki prowadzą do wygenerowania nowej pary rzutów, aby spróbować ponownie.]
Teraz generujesz losowy spacer z dwoma stanami pochłaniania za pomocą symulowanej uczciwej monety. Wybierając odległość stanów pochłaniania od źródła (jeden powyżej i jeden poniżej niego), możesz ustawić szansę absorpcji, mówiąc, że górny stan pochłaniania jest pożądanym stosunkiem liczb całkowitych. W szczególności, jeśli umieścisz górną barierę pochłaniającą w i niższy o (i rozpocznij proces od początku) i uruchom losowy spacer aż do absorpcji, prawdopodobieństwo absorpcji przy górnej barierze wynosi .
(Aby to pokazać, należy wykonać pewne obliczenia, ale można dość łatwo wyliczyć prawdopodobieństwa, pracując z relacjami powtarzalności ... lub możesz to zrobić, sumując nieskończone szeregi ... lub istnieją inne sposoby.)
[self-study]
tag i przeczytaj jego wiki . Pamiętaj, że na końcu pytania nie musisz prosić o pomoc - wiemy, że każdy, kto tu zamieszcza, ma nadzieję na pomoc!