在 PyMC3 中使用分类变量作为其他参数的索引
Using categorical variable as an index for other parameters in PyMC3
我正在尝试使用分类变量作为索引,以便从参数列表中为 PyMC3 中的另一个分布进行选择。我尝试使用 pm.switch()
和索引参数数组来执行此操作。代码运行良好,但分类变量似乎停留在我定义为 testval 的任何位置。
尝试 1:
import pymc3 as pm
import theano.tensor as tt
with pm.Model() as model:
b = pm.Bernoulli('b', .2, testval=0)
mu = pm.math.switch(b, 0, 10)
n = pm.Normal('n', mu=mu, sd=1)
trace = pm.sample(10000, tune=1000)
尝试 2:
with pm.Model() as model:
b = pm.Bernoulli('b',.2, testval=1)
mus = tt.as_tensor([0,10])
n = pm.Normal('n', mu=mus[b], sd=1)
trace = pm.sample(10000, tune=1000)
在两次尝试中,pm.summary(trace)
表明 b
仅在第一次尝试中被采样为 0,在第二次尝试中被采样为 1(对应于给定的测试值)。
b
的分布没有按照我定义的分布进行采样,我做错了什么?
pymc3 对 n
和 b
使用不同的步骤方法,因为一个是离散的,另一个是连续的——它不能同时改变它们。一开始 b
是 1,n
是 10。如果您建议将 b
更改为 0,则 logp 会很小,因为 n
是 10 sd它的意思。对 n
的更改将被接受,但前提是它不会偏离 10 太多。它不会足够接近 0,b
的变化将获得合理的概率。
典型的后验集可以分为两个区域(类似于 {0} \times [-a, +a] 和 {1} \times [10-a, 10+a])和采样器不能在它们之间移动:一些离散版本的多模态。
我正在尝试使用分类变量作为索引,以便从参数列表中为 PyMC3 中的另一个分布进行选择。我尝试使用 pm.switch()
和索引参数数组来执行此操作。代码运行良好,但分类变量似乎停留在我定义为 testval 的任何位置。
尝试 1:
import pymc3 as pm
import theano.tensor as tt
with pm.Model() as model:
b = pm.Bernoulli('b', .2, testval=0)
mu = pm.math.switch(b, 0, 10)
n = pm.Normal('n', mu=mu, sd=1)
trace = pm.sample(10000, tune=1000)
尝试 2:
with pm.Model() as model:
b = pm.Bernoulli('b',.2, testval=1)
mus = tt.as_tensor([0,10])
n = pm.Normal('n', mu=mus[b], sd=1)
trace = pm.sample(10000, tune=1000)
在两次尝试中,pm.summary(trace)
表明 b
仅在第一次尝试中被采样为 0,在第二次尝试中被采样为 1(对应于给定的测试值)。
b
的分布没有按照我定义的分布进行采样,我做错了什么?
pymc3 对 n
和 b
使用不同的步骤方法,因为一个是离散的,另一个是连续的——它不能同时改变它们。一开始 b
是 1,n
是 10。如果您建议将 b
更改为 0,则 logp 会很小,因为 n
是 10 sd它的意思。对 n
的更改将被接受,但前提是它不会偏离 10 太多。它不会足够接近 0,b
的变化将获得合理的概率。
典型的后验集可以分为两个区域(类似于 {0} \times [-a, +a] 和 {1} \times [10-a, 10+a])和采样器不能在它们之间移动:一些离散版本的多模态。