假设您想选择 n, p(n) 的分布,您可以应用贝叶斯定律。
你知道,在 n 实际发生的情况下,k 个事件发生的概率受二项式分布的支配
p(k|n)=(nk)pk(1−p)(n−k)
假设你观察到 k,你真正想知道的是 n 个事件实际发生的概率。通过贝叶斯奠定:
p(n|k)=p(k|n)p(n)p(k)
通过应用总概率定理,我们可以写出:
p(n|k)=p(k|n)p(n)∑n′p(k|n′)p(n′)
因此,如果没有更多信息,关于的分布,您将无法再进一步。p(n)
但是,如果您想为选择一个分布,其值大于或足够接近零,那么您可以做得更好。例如,假设范围内是均匀的。这个案例:p(n)np(n)=0n[0,nmax]
p(n)=1nmax
贝叶斯公式简化为:
p(n|k)=p(k|n)∑n′p(k|n′)
至于问题的最后一部分,我同意最好的方法是对执行累积求和,以生成累积概率分布函数,并迭代直到达到 0.95 限制。p(n|k)
鉴于这个问题是从 SO 迁移而来的,下面附上了 python 中的玩具示例代码
import numpy.random
p = 0.8
nmax = 200
def factorial(n):
if n == 0:
return 1
return reduce( lambda a,b : a*b, xrange(1,n+1), 1 )
def ncr(n,r):
return factorial(n) / (factorial(r) * factorial(n-r))
def binomProbability(n, k, p):
p1 = ncr(n,k)
p2 = p**k
p3 = (1-p)**(n-k)
return p1*p2*p3
def posterior( n, k, p ):
def p_k_given_n( n, k ):
return binomProbability(n, k, p)
def p_n( n ):
return 1./nmax
def p_k( k ):
return sum( [ p_n(nd)*p_k_given_n(nd,k) for nd in range(k,nmax) ] )
return (p_k_given_n(n,k) * p_n(n)) / p_k(k)
observed_k = 80
p_n_given_k = [ posterior( n, observed_k, p ) for n in range(0,nmax) ]
cp_n_given_k = numpy.cumsum(p_n_given_k)
for n in xrange(0,nmax):
print n, p_n_given_k[n], cp_n_given_k[n]