我正在編寫一篇文章中Dirichlet-Multinomial posterior的推導,我已閱讀過該文章,並且遇到了將分佈總結爲1的問題。下面是代碼的非簡化形式:在Python中正常化後驗分佈時遇到問題
def pcn(X, n, N, c, alpha):
pnc = np.math.factorial(np.sum([n[i] for i in range(len(n))]))/ \
np.product([np.math.factorial(n[i]) for i in range(len(n))])* \
np.product([c[i]**n[i] for i in range(len(n))])
pc = G(len(X)*alpha)/ \
np.product([G(alpha) for i in range(len(n)) if i in X])* \
np.product([(c[i])**(alpha - 1) for i in range(len(n)) if i in X])
pn = np.math.factorial(N)/ \
np.product([np.math.factorial(n[i]) for i in range(len(n)) if i in X])* \
G(len(X)*alpha)/ \
G(len(X)*alpha + N)* \
np.product([G(alpha + n[i])/G(alpha) for i in range(len(n)) if i in X])
return pnc
,我在這裏簡單去除得到劃分出來的零件:
def pcns(X, n, N, c, alpha):
pnc = np.product([c[i]**n[i] for i in range(len(n))])
pc = np.product([(c[i])**(alpha - 1) for i in range(len(n))])/ \
np.product([G(alpha) for i in range(len(n))])
pn = np.product([G(alpha + n[i])/G(alpha) for i in range(len(n))])/ \
G(len(X)*alpha + N)
return pnc * pc/pn
我設置的輸入變量和C的數組初始化輸入:
X = [0,1]
n = [6.0, 3.0]
N = sum(n)
alpha = 20
c = np.linspace(0, 1, 1000)
,然後我遍歷C和在每個C和情節評估我的後路功能:
dist = []
for i in c:
dist.append(pcns(X, n, N, [i, 1-i], alpha))
plt.plot(c,dist)
當我總結了dist
是999或len(c) - 1
我得到的值。會有人碰巧知道爲什麼它不是1?
太棒了!感謝您提供豐富的答案。順便說一下,G函數就是Gamma函數。對不起,我很困的時候寫了這個。 – user5590942