2017-02-09 56 views
2

pymc3中find_MAP的返回值是什麼?pymc3中的'find_MAP'輸出意味着什麼?

看來,pymc3.Normal和pymc3.Uniform變量不認爲是相同的:對於pymc3.Normal變量,find_MAP返回一個看起來像最大後驗概率的值。但對於pymc3.Uniform變量,我得到一個'_interval'後綴添加到變量的名稱,我沒有在文檔中找到返回值的含義(這可能看起來很荒謬,甚至不在物理限制內) 。

例如:

import numpy as np 
import pymc3 as pm3 
# create basic data such as obs = (x*0.95)**2+1.1+noise 
x=np.arange(10)+1 
obs=(x*0.95)**2+np.random.randn(10)+1.1 
# fitting the model y=a(1*x)**2+a0 on data points 
with pm3.Model() as model: 
    a0 = pm3.Uniform("a0",0,5) 
    a1 = pm3.Normal("a1",mu=1,sd=1) 
    a2 = pm3.Deterministic('a2',(x*a1)**2+a0) 
    hypothesis = pm3.Normal('hypothesis', mu=a2, sd=0.1, observed=obs) 
    start = pm3.find_MAP() 
print('start: ',start) 

回報:

Optimization terminated successfully. 
     Current function value: 570.382509 
     Iterations: 13 
     Function evaluations: 17 
     Gradient evaluations: 17 
start: {'a1': array(0.9461006484031161), 'a0_interval_': array(-1.0812715249577414)} 

回答

3

默認情況下,pymc3 transforms一些變量與到實數集的有限支持。當給定有界分佈(例如一些優化和採樣的方法)時,可以進行各種操作,否則該操作會窒息。當應用這種自動變換時,您添加到模型的隨機變量將成爲變換變量的子元素。這個轉換後的變量以[var]_[transform]_作爲名稱添加到模型中。

統一隨機變量的默認轉換稱爲「區間轉換」,此變量的新名稱爲[name]_interval_。 MAP估計是通過優化所有參數以使後驗概率最大化而找到的。我們只需要優化轉換後的變量,因爲這完全決定了您最初添加到模型中的變量的值。 pm.find_MAP()僅返回正在優化的變量,而不是原始變量。請注意,a2也不會返回,因爲它完全由a0a1決定。

該pymc3的間隔變換使用的code [^ 1]是

def forward(self, x): 
    a, b = self.a, self.b 
    r = T.log((x - a)/(b - x)) 
    return r 

a是下界,b是上界,和x是待轉化的變量。使用這張圖,非常接近下限的值已經將接近負無窮的值轉化,並且非常接近上限的值接近正無窮大。

知道了邊界,我們可以從實線轉換回有界區間。這pymc3使用造成這種情況的code

def backward(self, x): 
    a, b = self.a, self.b 
    r = (b - a) * T.exp(x)/(1 + T.exp(x)) + a 
    return r 

如果您自己應用此向後改造,可以恢復a0本身:

自動應用

(5 - 0) * exp(-1.0812715249577414)/(1 + exp(-1.0812715249577414)) + 0 = 1.26632733897

其他轉換包括log transform(變量界一方)和stick-breaking transform(對於總和爲1的變量)。

[^ 1]自承諾87cdd712c86321121c2ed3150764f3d847f5083c

+1

thx!這應該在文檔中明確說明...大問題。 –

+1

同意@Stéphane。 PyMC3有許多功能,似乎並不是官方的,也是圖書館API的一部分。我認爲作者經常重構,以至於他們沒有優先考慮最新的文檔。 如果你喜歡我的回答,請問「接受」嗎?謝謝! – bsmith89