'find_MAP' 输出在 pymc3 中意味着什么?
what does the 'find_MAP' output mean in pymc3?
pymc3 中 find_MAP 的返回值是多少?
似乎 pymc3.Normal 和 pymc3.Uniform 变量不被认为是相同的:对于 pymc3.Normal 变量,find_MAP returns 看起来像最大后验概率。但是对于 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)
returns:
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)}
默认情况下,pymc3 transforms 一些变量对实数集有界支持。这使得在给定有界分布时会阻塞的各种操作成为可能(例如,某些优化和采样方法)。应用此自动转换后,您添加到模型中的随机变量将成为转换后变量的子变量。此转换后的变量以 [var]_[transform]_
作为名称添加到模型中。
均匀随机变量的默认转换称为 "interval transformation",此变量的新名称为 [name]_interval_
。 MAP 估计是通过优化所有参数以最大化后验概率来找到的。我们只需要优化转换后的变量,因为这完全决定了您最初添加到模型中的变量的值。 pm.find_MAP()
returns 只有被优化的变量,而不是原始变量。请注意 a2
也不会返回,因为它完全由 a0
和 a1
.
决定
pymc3用于区间变换[^1]的code是
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 (for variables bounded on one side), and the stick-breaking transform(对于总和为 1 的变量)。
[^1] 截至提交 87cdd712c86321121c2ed3150764f3d847f5083c.
pymc3 中 find_MAP 的返回值是多少?
似乎 pymc3.Normal 和 pymc3.Uniform 变量不被认为是相同的:对于 pymc3.Normal 变量,find_MAP returns 看起来像最大后验概率。但是对于 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)
returns:
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)}
默认情况下,pymc3 transforms 一些变量对实数集有界支持。这使得在给定有界分布时会阻塞的各种操作成为可能(例如,某些优化和采样方法)。应用此自动转换后,您添加到模型中的随机变量将成为转换后变量的子变量。此转换后的变量以 [var]_[transform]_
作为名称添加到模型中。
均匀随机变量的默认转换称为 "interval transformation",此变量的新名称为 [name]_interval_
。 MAP 估计是通过优化所有参数以最大化后验概率来找到的。我们只需要优化转换后的变量,因为这完全决定了您最初添加到模型中的变量的值。 pm.find_MAP()
returns 只有被优化的变量,而不是原始变量。请注意 a2
也不会返回,因为它完全由 a0
和 a1
.
pymc3用于区间变换[^1]的code是
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 (for variables bounded on one side), and the stick-breaking transform(对于总和为 1 的变量)。
[^1] 截至提交 87cdd712c86321121c2ed3150764f3d847f5083c.