在n项伯努利试验序列中,有k次成功的概率


13

我正在尝试找出在25个试验的区块中连续进行8个试验的概率,您总共有8个区块(在25个试验中)要连续进行8个试验。根据猜测使任何试验正确的概率为1/3,在连续获得8个正确的块之后,该块将终止(因此,从技术上讲不可能连续获得8个以上的正确)。我将如何查找发生这种情况的可能性?我一直在考虑使用(1/3)^ 8作为连续正确获得8的可能性,如果我乘以17,则有17种可能的机会在25个试验的区块中连续获得8可能性*我得到136的8个块,在这种情况下1-(1-(1/3)^ 8)^ 136是否会让我有可能连续获得8个正确的数据?


1
我认为所给论点的问题在于所考虑的事件不是独立的。例如,考虑单个块。如果我告诉你,(一)不存在八个运行,在6位开始,(B)有开始于7位和(c)没有运行开始在8位运行,这是什么告诉你从9到15的位置开始奔跑的概率是多少?
主教

Answers:


14

通过跟踪事物,您可以获得精确的公式

假设为成功的概率,而为要计数的连续成功的次数。这些已解决问题。变量值为,即块中剩余的试验次数;和,已经观察到的连续成功的次数。让我们在用尽试验之前最终连续获得成功的机会记为。我们寻求。ķ = 8 Ĵ ķ ˚F p ķĴ ˚F 1 / 3 80 25 p=1/3k=8mjkmfp,k(j,m)f1/3,8(0,25)

假设我们已经连续进行试验就看到了成功。下一次试验是成功的,概率为这种情况下,增加到;否则它是失败的,概率为,在这种情况下重置为。无论哪种情况,减少。何处 m > 0 p j j + 1 1 p j 0 m 1jthm>0pjj+11pj0m1

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

作为起始条件对于(,我们已经连续看到),我们得到明显的结果和对于(,没有足够的试验来连续获取)。现在可以快速而直接地(使用动态编程,或者因为这个问题的参数很小,所以使用递归)进行计算0 ķ ˚F p ķĴ = 0 ķ - Ĵ > ķfp,k(k,m)=1m0kfp,k(j,m)=0kj>mk

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

当得出。八万零八百九十七/四三〇四六七二一0.0018793p=1/380897/430467210.0018793

相对快速的R代码来模拟这是

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

经过3秒钟的计算,输出为。尽管这看起来很高,但只有1.7个标准错误。我又进行了次迭代,:仅比预期少标准误差。(仔细检查一下,因为该代码的早期版本存在一个细微的错误,所以我还在Mathematica中运行了400,000次迭代,的估计值为。)10 6 0.001867 0.3 0.00184750.002131060.0018670.30.0018475

此结果小于问题中之一。但是,也许我还没有完全理解它:“您总共有8个区块...连续获得8个正确的试验”的另一种解释是,寻求的答案等于。1 - 1 - ˚F 1 / 3 80 25 8= 0.0149358 ...1(1(1/3)8)1360.02051(1f1/3,8(0,25))8)=0.0149358...


13

虽然@whuber出色的动态编程解决方案值得一读,但相对于试验总数m和所需试验长度k而言,其运行时间为,而矩阵求幂方法为Ok 3 log m 。如果m远远大于k,则以下方法更快。O(k2m)mkO(k3log(m))mk

两种解决方案都将问题视为一个马尔可夫链,其状态表示到目前为止字符串末尾的正确试验次数,并且是一个状态,用于连续获得所需的正确试验。过渡矩阵使得看到概率为的故障会使您返回状态0,否则概率为1 - p会使您进入下一个状态(最终状态为吸收状态)。通过将此矩阵提高到第n次幂,第一行和最后一列的值就是连续看到k = 8个头的概率。在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))

根据需要产生0.00187928367413。


10

根据这个答案,我将进一步解释@Neil G的Markov-Chain方法,并为中的此类问题提供一般的解决方案R。让我们用分别表示所需的正确试验次数,用n表示试验次数,用W(胜利)表示正确试验,用F(失败)表示错误试验。在跟踪试验的过程中,您想知道在当前序列结束时是否已经有8条正确试验的条幅以及正确试验的数量。有9个状态(k + 1):knWFk+1

:我们还没有 8个连续正确试验的是,最后的审判是 ˚FA8F

:我们还没有 8个连胜正确的审判还没有,最后两个试验是 ˚F w ^B8FW

:我们还没有 8个连续正确试验着呢,最后三个审判 ˚F w ^ w ^C8FWW

:我们还没有 8个连续正确试验着呢,晋级八强审判 ˚F w ^ w ^ w ^ w ^ w ^ w ^ w ^H8FWWWWWWW

:我们已经连续进行了 8次正确的试验!I8

移动至状态的概率从状态p = 1 / 3,并用概率1 - p = 2 / 3,我们留在状态。从状态,移动至状态的概率Ç1 / 3并用概率2 / 3,我们搬回。等等。如果我们处于状态I,我们就呆在那里。BAp=1/31p=2/3ABC1/32/3AI

由此,我们可以构建一个转换矩阵中号(作为每个列中号款项1和所有条目都为正,中号被称为左随机矩阵):9×9 MM1M

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

nMnjinI1II1IAn=25M25M9125M25Rexpm

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

AI0.001879284


3

这是我编写的一些R代码来模拟这一点:

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

我得到的值比您的公式小,所以我们中的一个人可能在某个地方犯了一个错误。


您的功能是否包括无法连续获得8个正确结果的试验,例如“试验”开始于20个试验?
米歇尔

最有可能的是,我的R模拟也给了我较小的值。我很好奇是否有代数解决方案可以解决这个简单的概率问题,以防有人对模拟提出异议。
AcidNynex 2012年

1
我认为可以通过提供您获得的输出来改进此答案,以便可以对其进行比较。当然,还包括直方图之类的东西会更好!乍一看,该代码对我来说似乎很正确。干杯。:)
主教

3

10

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

18p817p945p16+81p1736p18

p=1.03.0

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

0.00187928

也可以使用内置函数ProbabilityDiscreteMarkovProcess Mathematica函数直接对其进行评估:

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

0.00187928

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.