2017-02-13 33 views
2

如何在PYMC3中實現確定性向量運算?例如型號:如何在PYMC3中添加確定性向量運算?

M ~ Unif(-5, 5) 
S ~ Unif(0, |1/M|) 
data ~ Normal(M, S) 

M是高斯觀測值的均值,S是標準差。假設標準差均勻分佈在[0,| 1/M |](當M爲負值時需要絕對值)。

驗證碼:

import pymc3 as pm 
import numpy as np 
size = 20 
with pm.Model() as model: 
    # M ~ Unif(-5, 5) 
    M = pm.Uniform("M", -5., 5., shape=size) 
    # S ~ Unif(0, |1/M|) 
    # how to divide by vector and take abs val? 
    S = pm.Uniform("S", np.zeros(size), abs(1./M), shape=size) 
    data = pm.Normal("data", M, sd=S, shape=size) 

有錯誤:

File "/Users/mvd/anaconda/lib/python2.7/site-packages/pymc3/distributions/distribution.py", line 67, in get_test_val 
    str(defaults) + " pass testval argument or adjust so value is finite.") 
AttributeError: <pymc3.distributions.continuous.Uniform object at 0x10d1e1f10> has no finite default value to use, checked: ['median', 'mean', 'mode'] pass testval argument or adjust so value is finite. 

做我需要使用theano實現對向量這個操作?

回答

1

我猜你的模型有問題的部分是1/M。因爲當M接近於0時,這會趨於無窮。事實上,在你的例子中,M的第一個建議值是0(下邊界和上邊界的平均值),因此你得到的「無有限值」的誤差(誤差來自變量S)。來解決這個

的一種方式是通過一個合理testval值M(在這種情況下任何東西,但0),例如:

M = pm.Uniform("M", -5., 5., shape=size, testval=0.1) 

現在M將在0.1(而不是0)進行初始化

作爲一個方面說明,直覺上我認爲NUTS在從這個模型中正確採樣時會遇到麻煩,因此我認爲Metropolis可能是一個更好的選擇,但可以隨意嘗試不同的採樣器。

+0

謝謝。另外:什麼時候可以使用PYMC3中的隨機變量的確定性表達式,比如'abs(1。/ M)''而不用爲它們定製函數?爲什麼''pm.Uniform(「S」,np.zeros(size),abs(1/M),shape = size)''簡單地工作? – jll

+0

不客氣。 Theano理解像'/'這樣的運算符,你可以混合python/NumPy和theano變量。你不能直接做的是對期望python/NumPy變量的函數使用theano變量。在這種情況下,你可以使用'as_op'裝飾器。 – aloctavodia

相關問題