Припускаючи, що ви хочете вибрати розподіл для n, p (n), ви можете застосувати закон Байєса.
Ви знаєте, що ймовірність виникнення k подій, враховуючи, що n насправді сталося, регулюється біноміальним розподілом
p ( k | n ) = (нк)pк( 1 - с)( n - k )
Те, що ви дійсно хочете знати, - це ймовірність того, що n подій насправді відбулися, враховуючи, що ви спостерігали k. Байєс лежав:
p ( n | k ) =p ( k | n ) p ( n )p ( k )
Застосовуючи теорему про повну ймовірність, ми можемо записати:
p ( n | k ) =p ( k | n ) p ( n )∑н'р ( к |н') p (н')
Тож без додаткової інформації про розподіл дійсно не можна йти далі.p ( n )
Однак якщо ви хочете вибрати розподіл для для якого значення більше, ніж яке , або достатньо близьке до нуля, то ви можете зробити трохи краще. Наприклад, припустимо, що розподіл є рівномірним у діапазоні . цей випадок:p ( n )нp ( n ) = 0н[ 0 ,нм а х]
p ( n ) =1нм а х
Байєсівська рецептура спрощує:
p ( n | k ) =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]