[英]Using emcee with Gaussian Priors
我嘗試在使用司儀之前先使用高斯,似乎無法完全弄清楚。 基本上我要替換
def lnprior(theta):
a, b, c = theta
if 1.0 < a < 2.0 and 1.0 < b < 2.0 and 1.0 < c < 2.0:
return 0.0
return -np.inf
可以從具有mu和sigma的高斯分布中采樣“ a”的東西。 我該怎么做? 像這樣?
def lnprior(theta):
a, b, c = theta
if 1.0 < b < 2.0 and 1.0 < c < 2.0:
return 0.0
if 0<a<20:
mu=10
sigma=1
s=np.random.normal(mu, sigma)
return s
return -np.inf
那似乎不對嗎?
以下方法似乎對我有用
def lnprior(theta):
a, b, c = theta
#flat priors on b, c
if not 1.0 < b < 2.0 and 1.0 < c < 2.0:
return -np.inf
#gaussian prior on a
mu = 10
sigma = 1
return np.log(1.0/(np.sqrt(2*np.pi)*sigma))-0.5*(a-mu)**2/sigma**2
isinwe先前的答案是正確的答案,我只會嘗試解釋為什么它是正確的。
在問題中,有一個統一先驗的示例(與docs中的示例非常相似),如果theta
的值在某些約束范圍內,則返回0,否則返回無窮大。
這是正確的,因為此先驗將用於計算后驗概率:
但是,由於此概率往往很小,因此最好避免舍入誤差太大以使用對數,這意味着:
因此,統一先驗如下:
如果條件滿足,將始終為常數,否則為零。 由於此處僅比例相關,因此可以忽略歸一化常數。 因此,當采用對數時,當條件滿足時,對數將為零,否則將為負無窮大。
在多個先驗的情況下,它們相乘,一旦取對數,該和就成為和。 也就是說,在像示例一樣的均勻先驗的情況下,除非兩個條件都同時滿足,否則先驗的對數將為零,即-inf + 0 = -inf 。
在先驗組合更復雜的情況下,我們需要退回到先驗和的正確解釋。 因此,在手頭的情況下,先驗必須返回三個先驗對數中的每一個的對數之和,這正是isinwe答案中以有效方式完成的工作,如果統一先驗的貢獻已經存在,則避免了評估高斯。 -inf 。
通常,最好先檢查統一的先驗條件,如果條件不成立,則返回-inf;如果條件成立,則對所有其他更復雜的先驗條件求值並返回它們的總和(因為統一先驗可以近似為零)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.