Giả sử bạn muốn chọn một bản phân phối cho n, p (n), bạn có thể áp dụng luật Bayes.
Bạn biết rằng xác suất của k sự kiện xảy ra do n thực sự đã xảy ra bị chi phối bởi sự phân phối nhị thức
p ( k | n ) = ( nk) pk( 1 - p )( n - k )
Điều bạn thực sự muốn biết là xác suất của n sự kiện đã thực sự xảy ra, với điều kiện bạn quan sát thấy k. Bởi Bayes nằm:
p ( n | k ) = p ( k | n ) p ( n )p ( k )
Bằng cách áp dụng định lý về tổng xác suất, chúng ta có thể viết:
p ( n | k ) = p ( k | n ) p ( n )Σn'p ( k | n') p ( n')
Vì vậy, không có thêm thông tin, về việc phân phối bạn thực sự không thể tiến xa hơn.p ( n )
Tuy nhiên, nếu bạn muốn chọn phân phối cho có giá trị lớn hơn hoặc gần bằng 0, thì bạn có thể làm tốt hơn một chút. Ví dụ: giả sử rằng phân phối của là đồng nhất trong phạm vi . trường hợp này:p ( n )np ( n ) = 0n[ 0 , nm a x]
p ( n ) = 1nm a x
Công thức Bayes đơn giản hóa để:
p ( n | k ) = p ( k | n )Σn'p ( k | n')
Đối với phần cuối cùng của vấn đề, tôi đồng ý rằng cách tiếp cận tốt nhất là thực hiện tổng cộng tích lũy trên , để tạo hàm phân phối xác suất giả và lặp lại cho đến khi đạt đến giới hạn 0,95.p ( n | k )
Cho rằng câu hỏi này được di chuyển từ SO, mã mẫu đồ chơi trong python được đính kèm bên dưới
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]