2015-02-10 48 views
1

我正在嘗試使用pymc 2對一個簡單的概率編程示例進行建模。我一直在玩其他語言,比如Church和Anglican,並且能夠毫無困難地模擬這個問題。但是,我似乎無法在Python中找到它。如何用pymc 2對兩個泊松分佈的和進行建模?

這裏是code in Anglican,我認爲這是不言自明:

[assume a (- (poisson 100) 100)] 
[assume b (- (poisson 100) 100)] 
[observe (normal (+ a b) .00001) 7] 
[predict (list a b)] 

使用都市報 - 黑斯廷斯樣,我得到:

1 (10 1) 
    2 (10 8) 
9977 (7 0) 
    20 (7 1) 

隨着粒子吉布斯,我得到:

669 (-1 8) 
    71 (-10 17) 
    66 (-11 18) 
208 (-12 19) 
    19 (-13 20) 
    84 (-14 21) 
    72 (-15 22) 
441 (-2 9) 
...and so on... 

我試圖在pymc中這樣模擬它:

def make_model(): 
    a = (pymc.Poisson("a", 100) - 100) 
    b = (pymc.Poisson("b", 100) - 100) 

    precision = pymc.Uniform('precision', lower=.0001, upper=1.0) 

    @pymc.deterministic 
    def mu(a=a, b=b): 
     return a+b 

    y = pymc.Normal("y", mu=mu, tau=precision, observed=True, value=7) 

    return pymc.Model(locals()) 

def run_mcmc(model): 
    mcmc = pymc.MCMC(model) 
    mcmc.sample(5000, burn=1000, thin=2) 
    return mcmc 

result = run_mcmc(make_model()) 
pymc.Matplot.plot(result) 

我歌廳痕跡其中A和B是100左右。但是,如果我跑(pymc.Poisson("a", 100) - 100).value,我得到的數字接近0.

我失去了一些東西在這裏?我對這種可能性感到興奮,但我現在很困惑!謝謝你的幫助!

+0

你能更詳細地描述聖公會模型的輸出嗎?我不熟悉這個系統。 – 2015-02-10 20:13:28

+0

是的,它基本上是一個頻率計數。例如'9977(7 0)'表示a = 7,b = 0在10000個採樣中出現了9977次。 – stratospark 2015-02-10 23:23:49

回答

1

如果我正確理解這個,這是一個很好的例子來證明英國國教和PyMC之間的思想差異。

這裏是你的PyMC代碼微調的版本,我想抓住你的意圖:

def make_model(): 
    a = pymc.Poisson("a", 100) # better to have the stochastics themselves available 
    b = pymc.Poisson("b", 100) 

    precision = 1e-4**-2 # Seems like precision is fixed in Anglican model (and different from the meaning of precision in PyMC) 

    @pymc.deterministic 
    def mu(a=a, b=b): 
     return (a-100) + (b-100) 

    y = pymc.Normal("y", mu=mu, tau=precision, observed=True, value=7) 

    return pymc.Model(locals()) 

def run_mcmc(model): 
    mcmc = pymc.MCMC(model) 
    mcmc.use_step_method(pymc.AdaptiveMetropolis, [mcmc.a, mcmc.b]) 
    mcmc.sample(20000, burn=10000, thin=10) 
    return mcmc 

result = run_mcmc(make_model()) 
pymc.Matplot.plot(result) 

下面是我的代碼的主要區別:

  • ab是隨機指標。當您在
  • precision中使用(stochastic - 100)東西時,PyMC自己也很聰明,因爲它是一個數字,不是隨機的,而是一個大數字,而不是一個小數字。這是因爲PyMC在正態分佈中使用精度來表示1 /方差,但在英國國教(我認爲)精度意味着您需要相等運算符的精確程度。
  • mcmc使用自適應Metropolis步驟方法,具有較長的預燒期。這很重要,因爲ab的聯合後驗分佈具有極其相關性,除非計算出該結果,否則MCMC步驟將無法執行。

這是an IPython Notebook它顯示了一些細節。