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)
Run Code Online (Sandbox Code Playgroud)
返回:
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)}
Run Code Online (Sandbox Code Playgroud)
默认情况下,pymc3 将一些有界支持的变量转换为实数集。这启用了多种操作,否则这些操作在给定有界分布时会阻塞(例如某些优化和采样方法)。应用此自动转换后,您添加到模型中的随机变量将成为转换后的变量的子变量。这个转换后的变量以[var]_[transform]_名称添加到模型中。
统一随机变量的默认变换称为“区间变换”,该变量的新名称是[name]_interval_。MAP 估计是通过优化所有参数以最大化后验概率来找到的。我们只需要优化转换后的变量,因为这完全确定了您最初添加到模型中的变量的值。 pm.find_MAP()只返回被优化的变量,而不是原始变量。请注意,a2也不会返回,因为它完全由a0和确定a1。
的代码,对于间隔变换pymc3用途[^ 1]是
def forward(self, x):
a, b = self.a, self.b
r = T.log((x - a) / (b - x))
return r
Run Code Online (Sandbox Code Playgroud)
其中a,在下部的约束,b是上界,并且x是待转化的变量。使用此映射,非常接近下限的值转换后的值接近负无穷大,非常接近上限的值接近正无穷大。
知道了界限,我们可以从实线转换回有界区间。pymc3 为此使用的代码是
def backward(self, x):
a, b = self.a, self.b
r = (b - a) * T.exp(x) / (1 + T.exp(x)) + a
return r
Run Code Online (Sandbox Code Playgroud)
如果您自己应用此向后转换,则可以a0自行恢复:
(5 - 0) * exp(-1.0812715249577414) / (1 + exp(-1.0812715249577414)) + 0 = 1.26632733897
其他自动应用的变换包括对数变换(对于在一侧有界的变量)和断棒变换(对于总和为 1 的变量)。
[^1] 截至提交87cdd712c86321121c2ed3150764f3d847f5083c。
| 归档时间: |
|
| 查看次数: |
2518 次 |
| 最近记录: |