n, p (n)에 대한 분포를 선택한다고 가정하면 Bayes 법칙을 적용 할 수 있습니다.
n이 실제로 발생했을 때 발생하는 k 개의 사건 확률이 이항 분포에 의해 결정된다는 것을 알고 있습니다.
p ( k | n ) = (엔케이)피케이( 1 - p)( n - k )
실제로 알고 싶은 것은 k를 관찰하면 n 개의 이벤트가 실제로 발생할 확률입니다. 베이 즈 (Bayes)
p ( n | k ) =p ( k | n ) p ( n )p ( k )
총 확률 이론을 적용하면 다음과 같이 쓸 수 있습니다.
p ( n | k ) =p ( k | n ) p ( n )∑엔'p ( k |엔') p (엔')
따라서 의 분포에 대한 추가 정보 없이는 더 이상 갈 수 없습니다.p ( n )
그러나 보다 큰 값이 있거나 충분히 에 가까운 대한 분포를 선택 하려면 조금 더 잘 수행 할 수 있습니다. 예를 들어, 의 분포가 범위에서 균일 하다고 가정하십시오 . 이 경우:p ( n )엔p ( n ) = 0엔[ 0 ,엔해요 X를]
p ( n ) =1엔해요 X를
베이지안 공식은 다음을 단순화합니다.
p ( n | k ) =p ( k | n )∑엔'p ( k |엔')
문제의 마지막 부분은 대해 누적 합산을 수행하고 누적 확률 분포 함수를 생성하고 0.95 한계에 도달 할 때까지 반복 하는 것이 최선의 방법이라는 데 동의합니다 .p ( n | k )
이 질문이 SO에서 마이그레이션되었다는 것을 감안할 때 파이썬의 장난감 샘플 코드는 아래에 첨부되어 있습니다
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]