Simulieren Sie eine Bernoulli-Variable mit der Wahrscheinlichkeit

9

Kann mir jemand sagen, wie man simuliert , wobei mit einem Münzwurf (so oft Sie möchten) mit &Bernoulli(ab)a,bNP(H)=p

Ich dachte über die Verwendung von Ablehnungsproben nach, konnte sie aber nicht festnageln.

Abrakadabra
quelle
1
Ist das eine Frage, die ursprünglich aus einem Kurs oder Lehrbuch stammt? Wenn ja, fügen Sie bitte das [self-study]Tag hinzu und lesen Sie das Wiki . Beachten Sie, dass Sie am Ende Ihrer Frage nicht um Hilfe bitten müssen - wir wissen, dass jeder, der hier schreibt, auf Hilfe hofft!
Silberfischchen
1
Es gibt hier irgendwo einen ausgezeichneten Beitrag von @Glen_b (obwohl ich mich nicht erinnern kann, wo) darüber, warum es keine "voreingenommene Münze mit der Wahrscheinlichkeit " gibt, aber ich weiß, dass dies nur ein Randproblem Ihrer Frage ist! p
Silberfischchen
2
@dsaxton Die Frage lautet "so viele wie Sie benötigen"; Es wird mit der Wahrscheinlichkeit 1 endlich sein, aber nicht begrenzt (Sie können eine festgelegte Anzahl von Würfen überschreiten). Wenn Sie jedoch auf dieser Grundlage Einwände erheben, bedeutet dies, dass "eine faire Münze werfen, bis Sie einen Kopf bekommen" als Methode zur Erzeugung von Geometrie nicht praktikabel ist ( Zufallszahlen.12
Glen_b - Monica am
1
@AbracaDabra Ist das eine Übung für eine Klasse? Wenn nicht, wie entsteht es?
Glen_b -State Monica
1
@Glen_b: Es ist keine Übung aus meiner Klasse. Mir ist gerade in dieser Gedankenkette der Gedanke gekommen ...: Nehmen Sie nach der klassischen Wahrscheinlichkeit eine faire Münze, wenn Sie die Anzahl der konvergiert das Verhältnis von zur Hälfte. Es muss also auch für voreingenommene gelten ... Um eine Münze dazu zu bringen, zu einer bestimmten Zahl zu konvergieren, muss das diese Zahl sein. Nun dachte ich, was ist, wenn wir eine Zahl produzieren wollen, aber wir haben eine Münze mit eine andere Zahl (bekannt oder unbekannt)? P(H)P(H)#Heads#tailsP(H)P(H)
AbracaDabra

Antworten:

8

Da es unzählige Lösungen gibt, sollten wir eine effiziente finden .

Die Idee dahinter beginnt mit einer Standardmethode zur Implementierung einer Bernoulli-Variablen: Vergleichen Sie eine einheitliche Zufallsvariable mit dem Parameter . Wenn , geben Sie ; Andernfalls geben Sie .a / b U < a / b 1 0Ua/bU<a/b10

Wir können die Münze als einheitlichen Zufallszahlengenerator verwendenp . Um innerhalb eines beliebigen Intervalls gleichmäßig eine Zahl zu erzeugen , werfen Sie die Münze. Wenn es Köpfe sind, erzeugen Sie rekursiv einen einheitlichen Wert im ersten Teil des Intervalls; Wenn es sich um Schwänze handelt, generieren Sie rekursiv aus dem letzten Teil des Intervalls. Irgendwann wird das Zielintervall so klein, dass es nicht wirklich darauf ankommt, wie Sie eine Zahl daraus auswählen: So beginnt die Rekursion. Es ist offensichtlich, dass dieses Verfahren gleichmäßige Variationen erzeugt (bis zu jeder gewünschten Präzision), wie durch Induktion leicht bewiesen werden kann.[ x , y ) X p X 1 - pU[x,y)XpX1p

Diese Idee ist nicht effizient, führt aber zu einer effizienten Methode. Da Sie in jeder Phase eine Zahl aus einem bestimmten Intervall zeichnen, sollten Sie zunächst prüfen, ob Sie sie überhaupt zeichnen müssen. Wenn Ihr Zielwert außerhalb dieses Intervalls liegt, kennen Sie bereits das Ergebnis des Vergleichs zwischen dem Zufallswert und dem Ziel. Daher neigt dieser Algorithmus dazu, schnell zu enden. (Dies könnte als das in der Frage angeforderte Ablehnungsstichprobenverfahren ausgelegt werden .)[x,y)

Wir können diesen Algorithmus weiter optimieren. Zu jedem Zeitpunkt haben wir tatsächlich zwei Münzen, die wir verwenden können: Durch Umbenennen unserer Münze können wir daraus eine machen, die Köpfe mit einer Chance von . Daher können wir als Vorberechnung rekursiv auswählen, welche Neukennzeichnung zu der geringeren erwarteten Anzahl von Flips führt, die für die Beendigung benötigt werden. (Diese Berechnung kann ein teurer Schritt sein.)1p

Zum Beispiel ist es ineffizient, eine Münze mit zu verwenden, um eine Bernoulli -Variable direkt zu emulieren : Es dauert durchschnittlich fast zehn Flips. Wenn wir jedoch eine Münze verwenden, sind wir mit nur zwei Flips sicher fertig und die erwartete Anzahl von Flips beträgt nur .( 0,01 ) p = 1 - 0,0 = 0,1 1,2p=0.9(0.01)p=10.0=0.11.2

Hier sind die Details.

Partitionieren Sie jedes gegebene halboffene Intervall in die IntervalleI=[x,y)

[x,y)=[x,x+(yx)p)[x+(yx)p,y)=s(I,H)s(I,T).

Dies definiert die zwei Transformationen und , die in halboffenen Intervallen arbeiten.s ( , T )s(,H)s(,T)

Aus terminologischen Gründen, wenn eine Menge von reellen Zahlen lass den AusdruckI

t<I

bedeuten , dass eine untere Schranke für ist : für alle . In ähnlicher Weise bedeutet dass eine Obergrenze für .tIt<xxIt>ItI

Schreiben Sie . (Tatsächlich macht es keinen Unterschied, ob real statt rational ist; wir benötigen nur )a/b=tt0t1

Hier ist der Algorithmus, um eine Variable mit dem gewünschten Bernoulli-Parameter zu erzeugen :Z

  1. Setze und .n=0In=I0=[0,1)

  2. Während {Wirf die Münze, um zu erzeugen . Setze Inkrement .}(tIn)Xn+1In+1=S(In,Xn+1).n

  3. Wenn dann setze . Andernfalls setzen Sie .t>In+1Z=1Z=0


Implementierung

Zur Veranschaulichung ist hier eine RImplementierung des Alorithmus als Funktion draw. Seine Argumente sind der Zielwert und das Intervall , anfänglich . Es verwendet die Hilfsfunktion, die implementiert . Obwohl dies nicht erforderlich ist, wird auch die Anzahl der Münzwürfe verfolgt. Es gibt die Zufallsvariable, die Anzahl der Würfe und das zuletzt untersuchte Intervall zurück.t[x,y)[0,1)ss

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))
}

Nehmen Sie als Beispiel für seine Verwendung und Prüfung seiner Genauigkeit den Fall und . Zeichnen wir mit dem Algorithmus Werte, berichten über den Mittelwert (und seinen Standardfehler) und geben die durchschnittliche Anzahl der verwendeten Flips an.t=1/100p=0.910,000

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

In dieser Simulation waren der Flips Köpfe. Obwohl niedriger als das Ziel von , ist der Z-Score von nicht signifikant: Diese Abweichung kann dem Zufall zugeschrieben werden. Die durchschnittliche Anzahl der Flips betrug - etwas weniger als zehn. Wenn wir die Münze verwendet hätten, wäre der Mittelwert immer noch nicht signifikant anders als das Ziel, aber wären nur Flips erforderlich gewesen.0.00950.010.51549.8861p0.00941.177

whuber
quelle
Ich kann nicht anders, als die Ähnlichkeiten zwischen dieser Lösung und der Lösung 2 in meiner Antwort zu sehen. Während ich von einer unvoreingenommenen Münze ausgehe (PS wirklich interessante Lösung für das voreingenommene Münzproblem) und alle Berechnungen / Vergleiche in Basis 2 durchführe, führen Sie alle Berechnungen / Vergleiche in Basis 10 durch. Was denken Sie?
Cam.Davidson.Pilon
1
@cam Ich denke, Sie könnten sich von meinen Beispielen täuschen lassen: Obwohl sie in Basis 10 nette Zahlen verwenden, hat die Konstruktion überhaupt nichts mit einer bestimmten Basis zu tun.
whuber
2
(+1) Sehr ordentliche Auflösung. Die Optimierung steht in der oberen und unteren Grenze durch Potenzen wie und / oder . Es wäre schön, die optimale Zweiteilung in Bezug auf die Anzahl der simulierten Bernoullis zu finden. a/bpn(1p)m(n+mm)pn(1p)m
Xi'an
4

Hier ist eine Lösung (etwas chaotisch, aber es ist mein erster Stich). Sie können tatsächlich ignorieren und WLOG nimmt 1/2 an . Warum? Es gibt einen cleveren Algorithmus , um aus zwei vorgespannten Münzwürfen einen unvoreingenommenen Münzwurf zu generieren. Wir können also 1/2 annehmen .P(H)=pP(H)=1/2P(H)=1/2

Um einen zu generieren , kann ich mir zwei Lösungen vorstellen (die erste ist nicht meine eigene, aber die zweite ist eine Verallgemeinerung):Bernoulli(ab)

Lösung 1

Wirf die unbefangene Münze mal um. Wenn Köpfe vorhanden sind, beginnen Sie von vorne. Wenn Kopf ist vorhanden, Rückkehr , ob die erste Münze ist ein Kopf oder nicht (weil )baaP(first coin is heads | a heads in b coins)=ab

Lösung 2

Dies kann auf einen beliebigen Wert von . Schreiben Sie in binärer Form. Beispiel:Bernoulli(p)p0.1=0.0001100110011001100110011...base 2

Wir werden eine neue Binärzahl mit Münzwürfen erstellen. Beginnen Sie mit Fügen Sie Ziffern hinzu, je nachdem, ob Kopf (1) oder Zahl (0) angezeigt werden. Vergleichen Sie bei jedem Flip Ihre neue Binärzahl mit der Binärdarstellung von bis zur gleichen Ziffer . Schließlich werden die beiden auseinander gehen und zurückkehren, wenn größer als Ihre Binärzahl ist.p b i n ( p )0.p bin(p)

In Python:

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

Einige Beweise:

np.mean([simulate(0.4) for i in range(10000)])

ist ungefähr 0,4 (jedoch nicht schnell)

Cam.Davidson.Pilon
quelle
Schöne Antwort, aber können Sie mit Ihrer Methode 1 erklären, wie man mit irrationalem p umgeht?
AbracaDabra
2
@AbracaDabra warum sollte die Rationalität von Rolle spielen? p
Glen_b -Rate State Monica
@AbracaDabra: Unabhängig vom Wert von ist die Wahrscheinlichkeit, und erhalten, gleich, nämlich , daher beträgt die Wahrscheinlichkeit, einen gegen den anderen zu erhalten, . ( 0 , 1 ) ( 1 , 0 ) p ( 1 - p ) 1 / 2p(0,1)(1,0)p(1p)1/2
Xi'an
4

Ich sehe eine einfache Lösung, aber zweifellos gibt es viele Möglichkeiten, einige davon vermutlich einfacher. Dieser Ansatz kann in zwei Schritte unterteilt werden:

  1. Generieren aus zwei Ereignissen mit gleicher Wahrscheinlichkeit bei einem unfairen Münzwurfverfahren (die Kombination der jeweiligen Münze und der Methode, mit der sie geworfen wird, um einen Kopf mit der Wahrscheinlichkeit erzeugen ). Wir können diese beiden gleich wahrscheinlichen Ereignisse und . [Hierfür gibt es einen einfachen Ansatz, bei dem zwei Wurfpaare und , um zwei gleich wahrscheinliche Ergebnisse zu erzielen, wobei alle anderen Ergebnisse zur Erzeugung eines neuen Paares führen von Brötchen, um es erneut zu versuchen.]H * T * H * = ( H , T ) T * = ( T , H )pHTH=(H,T)T=(T,H)

  2. Jetzt erzeugen Sie mit der simulierten fairen Münze einen zufälligen Spaziergang mit zwei absorbierenden Zuständen. Durch Auswahl des Abstands der absorbierenden Zustände vom Ursprung (einer darüber und einer darunter) können Sie die Absorptionswahrscheinlichkeit einstellen, indem Sie beispielsweise den oberen absorbierenden Zustand als ein gewünschtes Verhältnis von ganzen Zahlen festlegen. Insbesondere wenn Sie die obere Absorptionsbarriere bei und die untere bei (und den Prozess vom Ursprung aus starten) und den Random Walk bis zur Absorption ausführen, beträgt die Wahrscheinlichkeit der Absorption an der oberen Barriere .- ( b - a ) aa(ba)aa+(ba)=ab

    (Es müssen hier einige Berechnungen durchgeführt werden, um dies zu zeigen, aber Sie können die Wahrscheinlichkeiten ziemlich einfach ermitteln, indem Sie mit Wiederholungsrelationen arbeiten ... oder Sie können dies tun, indem Sie unendliche Reihen summieren ... oder es gibt andere Möglichkeiten.)

Glen_b - Monica neu starten
quelle