N, p (n) için bir dağılım seçmek istediğinizi varsayarsak, Bayes yasasını uygulayabilirsiniz.
Aslında n meydana geldiği göz önüne alındığında k olaylarının meydana gelme olasılığının bir binom dağılımı ile yönetildiğini biliyorsunuz.
p ( k | n ) = (nk)pk( 1 - p)( n - k )
Gerçekten bilmek istediğiniz şey, k gözlemlediğiniz göz önüne alındığında, n olayın gerçekleşme olasılığıdır. Bayes lay tarafından:
p ( n | k ) =p ( k | n ) p ( n )p ( k )
Toplam olasılık teoremini uygulayarak şunu yazabiliriz:
p(n|k)=p(k|n)p(n)∑n′p(k|n′)p(n′)
Dolayısıyla, daha fazla bilgi olmadan, nin dağılımı hakkında daha fazla ilerleyemezsiniz.p(n)
Bununla birlikte, bir dağılım almak istiyorum olan bir değeri vardır burada daha büyük , ya da yeterince sıfıra yakın, daha sonra biraz daha iyi yapabilir. Örneğin, dağılımının aralığında eşit olduğunu varsayalım . bu durum:p(n)np(n)=0n[0,nmax]
p(n)=1nmax
Bayes formülasyonu aşağıdakileri basitleştirir:
p(n|k)=p(k|n)∑n′p(k|n′)
Sorunun son kısmına gelince, en iyi yaklaşımın üzerinde kümülatif bir toplama yapmak , kümülatif olasılık dağılım fonksiyonunu oluşturmak ve 0.95 sınırına ulaşılana kadar tekrarlamak olduğunu kabul ediyorum .p(n|k)
Bu sorunun SO'dan taşındığı göz önüne alındığında, python'daki oyuncak örnek kodu aşağıda eklenmiştir
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]