在 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 对 nb 使用不同的步骤方法,因为一个是离散的,另一个是连续的——它不能同时改变它们。一开始 b 是 1,n 是 10。如果您建议将 b 更改为 0,则 logp 会很小,因为 n 是 10 sd它的意思。对 n 的更改将被接受,但前提是它不会偏离 10 太多。它不会足够接近 0,b 的变化将获得合理的概率。

典型的后验集可以分为两个区域(类似于 {0} \times [-a, +a] 和 {1} \times [10-a, 10+a])和采样器不能在它们之间移动:一些离散版本的多模态。