Wahrscheinlichkeit eines Durchlaufs von k Erfolgen in einer Folge von n Bernoulli-Versuchen


13

Ich versuche herauszufinden, mit welcher Wahrscheinlichkeit 8 Versuche hintereinander in einem Block von 25 Versuchen korrekt sind. Sie haben insgesamt 8 Blöcke (von 25 Versuchen), um 8 Versuche hintereinander korrekt zu machen. Die Wahrscheinlichkeit, dass ein Versuch aufgrund von Vermutungen korrekt ist, beträgt 1/3. Wenn 8 in einer Reihe korrekt sind, enden die Blöcke (mehr als 8 in einer Reihe korrekt zu sein, ist technisch nicht möglich). Wie würde ich vorgehen, um die Wahrscheinlichkeit für dieses Auftreten zu ermitteln? Ich habe darüber nachgedacht, (1/3) ^ 8 als Wahrscheinlichkeit dafür zu verwenden, dass 8 in einer Reihe korrekt sind. Es gibt 17 mögliche Chancen, in einem Block von 25 Versuchen 8 in einer Reihe zu erhalten, wenn ich 17 multipliziere Möglichkeiten * 8 Blöcke bekomme ich 136, würde mir 1- (1- (1/3) ^ 8) ^ 136 die Wahrscheinlichkeit geben, dass ich in dieser Situation 8 in einer Reihe richtig hinbekomme, oder fehle ich hier etwas Grundlegendes?


1
Ich glaube, das Problem mit dem Argument ist, dass die betrachteten Ereignisse nicht unabhängig sind. Betrachten Sie beispielsweise einen einzelnen Block. Wenn ich Ihnen sage , dass (a) gibt es keine von acht , dass beginnt an Position 6, (b) es ist ein Durchlauf , beginnend an Position 7 und (c) gibt es keinen Lauf , beginnend an Position 8, was sagt Ihnen das über die Wahrscheinlichkeit, dass ein Lauf an Positionen von 9 bis 15 beginnt?
Kardinal

Antworten:


14

Wenn Sie den Überblick behalten, erhalten Sie eine genaue Formel .

Lassen Sie die Wahrscheinlichkeit des Erfolgs und k = 8 , die Anzahl der Erfolge in einer Zeile , die Sie zählen möchten. Diese sind für das Problem behoben. Variable Werte sind m , die Anzahl der im Block verbleibenden Versuche; und j die Anzahl der bereits beobachteten aufeinanderfolgenden Erfolge. Die Chance, letztendlich k Erfolge in Folge zu erzielen, bevor m Versuche erschöpft sind, sei f p , k ( j , m ) geschrieben . Wir suchen f 1 / 3 , 8 (p=1/3k=8mjkmfp,k(j,m) .f1/3,8(0,25)

Angenommen, wir haben gerade unseren Erfolg in Folge mit m > 0 verbleibenden Versuchen gesehen. Der nächste Versuch ist entweder ein Erfolg, wobei die Wahrscheinlichkeit p - in diesem Fall j auf j + 1 - erhöht wird ; oder es ist ein Fehler mit der Wahrscheinlichkeit 1 - p -, in welchem ​​Fall j auf 0 zurückgesetzt wird . In beiden Fällen nimmt m um 1 ab . Woherjthm>0pjj+11-pj0m1

fp,k(j,m)=pfp,k(j+1,m1)+(1p)fp,k(0,m1).

As starting conditions we have the obvious results fp,k(k,m)=1 for m0 (i.e., we have already seen k in a row) and fp,k(j,m)=0 for kj>m (i.e., there aren't enough trials left to get k in a row). It is now fast and straightforward (using dynamic programming or, because this problem's parameters are so small, recursion) to compute

fp,8(0,25)=18p817p945p16+81p1736p18.

When p=1/3 this yields 80897/430467210.0018793.

Relatively fast R code to simulate this is

hits8 <- function() {
    x <- rbinom(26, 1, 1/3)                # 25 Binomial trials
    x[1] <- 0                              # ... and a 0 to get started with `diff`
    if(sum(x) >= 8) {                      # Are there at least 8 successes?
        max(diff(cumsum(x), lag=8)) >= 8   # Are there 8 successes in a row anywhere?
    } else {
        FALSE                              # Not enough successes for 8 in a row
    }
}
set.seed(17)
mean(replicate(10^5, hits8()))

Nach 3 Sekunden Berechnung beträgt die Ausgabe . Obwohl dies hoch aussieht, sind es nur 1,7 Standardfehler. Ich führte weitere 10 6 Iterationen aus und ergab 0,001867 : nur 0,3 Standardfehler weniger als erwartet. (Da eine frühere Version dieses Codes einen subtilen Fehler aufwies , führte ich in Mathematica außerdem 400.000 Iterationen aus , um eine Schätzung von 0,0018475 zu erhalten .)0.002131060.0018670.30.0018475

Dieses Ergebnis ist weniger als ein Zehntel des Schätzwert von in Frage. Aber vielleicht habe ich nicht ganz verstanden es: eine andere Interpretation von „Sie haben insgesamt 8 Blöcke ... um 8 Versuche in einer Reihe korrigieren“ ist , dass die Antwort Sein Gleichen gesucht 1 - ( 1 - f 1 / 3 , 8 ( 0 , 25 ) ) 8 ) = 0,0149358 ... .1(1(1/3)8)1360.02051(1f1/3,8(0,25))8)=0.0149358...


13

While @whuber's excellent dynamic programming solution is well worth a read, its runtime is O(k2m) with respect to total number of trials m and the desired trial length k whereas the matrix exponentiation method is O(k3log(m)). If m is much larger than k, the following method is faster.

Beide Lösungen betrachten das Problem als eine Markov-Kette mit Zuständen, die die Anzahl der korrekten Versuche am Ende des Strings darstellen, und einem Zustand zum Erreichen der gewünschten korrekten Versuche hintereinander. Die Übergangsmatrix ist so beschaffen, dass Sie bei einem Fehler mit der Wahrscheinlichkeit zum Zustand 0 zurückkehren und ansonsten mit der Wahrscheinlichkeit 1 - p zum nächsten Zustand gelangen (der Endzustand ist ein absorbierender Zustand). Durch Erhöhen dieser Matrix auf die n- te Potenz ist der Wert in der ersten Zeile und in der letzten Spalte die Wahrscheinlichkeit, k = 8 Köpfe in einer Zeile zu sehen. In Python:p1pnk=8

import numpy as np

def heads_in_a_row(flips, p, want):
    a = np.zeros((want + 1, want + 1))
    for i in range(want):
        a[i, 0] = 1 - p
        a[i, i + 1] = p
    a[want, want] = 1.0
    return np.linalg.matrix_power(a, flips)[0, want]

print(heads_in_a_row(flips=25, p=1.0 / 3.0, want=8))

ergibt nach Wunsch 0,00187928367413.


10

According to this answer, I will explain the Markov-Chain approach by @Neil G a bit more and provide a general solution to such problems in R. Let's denote the desired number of correct trials in a row by k, the number of trials as n and a correct trial by W (win) and an incorrect trial by F (fail). In the process of keeping track of the trials, you want to know whether you already had a streak of 8 correct trials and the number of correct trials at the end of your current sequence. There are 9 states (k+1):

A: We have not had 8 correct trials in a row yet, and the last trial was F.

B: We have not had 8 correct trials in a row yet, and the last two trials were FW.

C: We have not had 8 correct trials in a row yet, and the last three trials were FWW.

H: We have not had 8 correct trials in a row yet, and the last eight trials were FWWWWWWW.

I: We've had 8 correct trials in a row!

The probability of moving to state B from state A is p=1/3 and with probability 1p=2/3 we stay in state A. From state B, the probability of moving to state C is 1/3 and with probability 2/3 we move back to A. And so on. If we are in state I, we stay there.

From this, we can construct a 9×9 transition matrix M (as each column of M sums to 1 and all entries are positive, M is called a left stochastic matrix):

M=(2/32/32/32/32/32/32/32/301/30000000001/30000000001/30000000001/30000000001/30000000001/30000000001/30000000001/31)

Each column and row corresponds to one state. After n trials, the entries of Mn give the probability of getting from state j (column) to state i (row) in n trials. The rightmost column corresponds to the state I and the only entry is 1 in the right lower corner. This means that once we are in state I, the probability to stay in I is 1. We are interested in the probability of getting to state I from state A in n=25 steps which corresponds to the lower left entry of M25 (i.e. M9125). All we have to do now is calculating M25. We can do that in R with the matrix power function from the expm package:

library(expm)

k <- 8   # desired number of correct trials in a row
p <- 1/3 # probability of getting a correct trial
n <- 25  # Total number of trials 

# Set up the transition matrix M

M <- matrix(0, k+1, k+1)

M[ 1, 1:k ] <- (1-p)

M[ k+1, k+1 ] <- 1

for( i in 2:(k+1) ) {

  M[i, i-1] <- p

}

# Name the columns and rows according to the states (A-I)

colnames(M) <- rownames(M) <- LETTERS[ 1:(k+1) ]

round(M,2)

     A    B    C    D    E    F    G    H I
A 0.67 0.67 0.67 0.67 0.67 0.67 0.67 0.67 0
B 0.33 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0
C 0.00 0.33 0.00 0.00 0.00 0.00 0.00 0.00 0
D 0.00 0.00 0.33 0.00 0.00 0.00 0.00 0.00 0
E 0.00 0.00 0.00 0.33 0.00 0.00 0.00 0.00 0
F 0.00 0.00 0.00 0.00 0.33 0.00 0.00 0.00 0
G 0.00 0.00 0.00 0.00 0.00 0.33 0.00 0.00 0
H 0.00 0.00 0.00 0.00 0.00 0.00 0.33 0.00 0
I 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.33 1

# Calculate M^25

Mn <- M%^%n
Mn[ (k+1), 1 ]
[1] 0.001879284

The probability of getting from state A to state I in 25 steps is 0.001879284, as established by the other answers.


3

Here is some R code that I wrote to simulate this:

tmpfun <- function() {
     x <- rbinom(25, 1, 1/3)  
     rx <- rle(x)
     any( rx$lengths[ rx$values==1 ] >= 8 )
}

tmpfun2 <- function() {
    any( replicate(8, tmpfun()) )
}

mean(replicate(100000, tmpfun2()))

I am getting values a little smaller than your formula, so one of us may have made a mistake somewhere.


Does your function include trials where it is impossible to get 8 in a row right, e.g. where the "run" started on trial 20?
Michelle

Most likely me, my R simulation is giving me smaller values as well. I'm just curious if there is an algebraic solution to solve this as a simple probability issue in case someone disputes a simulation.
AcidNynex

1
I think this answer would be improved by providing the output you obtained so that it can be compared. Of course, including something like a histogram in addition would be even better! The code looks right to me at first glance. Cheers. :)
cardinal

3

Here is a Mathematica simulation for the Markov chain approach, note that Mathematica indexes by 1 not 0:

M = Table[e[i, j] /. {
    e[9, 1] :> 0,
    e[9, 9] :> 1,
    e[_, 1] :> (1 - p),
    e[_, _] /; j == i + 1 :> p,
    e[_, _] :> 0
  }, {i, 1, 9}, {j, 1, 9}];

x = MatrixPower[M, 25][[1, 9]] // Expand

This would yield the analytical answer:

18p817p945p16+81p1736p18

Evaluating at p=1.03.0

x /. p -> 1/3 // N

Will return 0.00187928

This can also be evaluated directly using builtin Probability and DiscreteMarkovProcess Mathematica functions:

Probability[k[25] == 9, Distributed[k, DiscreteMarkovProcess[1, M /. p -> 1/3]]] // N

Which will get us the same answer: 0.00187928

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.