'find_MAP'输出在pymc3中意味着什么?

时间:2017-02-09 21:12:29

标签: pymc3

pymc3中find_MAP的返回值是什么?

似乎pymc3.Normal和pymc3.Uniform变量不被认为是相同的:对于pymc3.Normal变量,find_MAP返回一个看起来像最大后验概率的值。但对于pymc3.Uniform变量,我得到一个'_interval'后缀添加到变量的名称,我没有在doc中找到返回值的含义(这可能看起来很荒谬,甚至在物理限制内)

例如:

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)}

1 个答案:

答案 0 :(得分: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