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)}
答案 0 :(得分:3)
默认情况下,pymc3 transforms一些变量支持实数集。这使得能够进行各种操作,否则当给定有界分布时(例如某些优化和采样方法)会阻塞这些操作。应用此自动转换时,添加到模型的随机变量将成为转换变量的子项。此变换变量将添加到模型中,并以[var]_[transform]_
作为名称。
统一随机变量的默认转换称为“区间转换”,此变量的新名称为[name]_interval_
。通过优化所有参数以最大化后验概率来发现MAP估计。我们只需要优化变换后的变量,因为这完全决定了您最初添加到模型中的变量的值。 pm.find_MAP()
仅返回正在优化的变量,而不返回原始变量。请注意,a2
也不会被返回,因为它完全由a0
和a1
确定。
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。