使用分类变量作为PyMC3中其他参数的索引

时间:2017-05-19 13:55:52

标签: python pymc3

我正在尝试使用分类变量作为索引,从PyMC3中的另一个分布的参数列表中进行选择。我已尝试使用<script src="https://cdn.anychart.com/js/7.13.1/anychart-bundle.min.js"></script> <link rel="stylesheet" href="https://cdn.anychart.com/css/7.13.1/anychart-ui.min.css" /> <div id="container"></div> <script src="https://cdn.anychart.com/js/7.13.1/anychart-bundle.min.js"></script> <link rel="stylesheet" href="https://cdn.anychart.com/css/latest/anychart-ui.min.css">和索引参数数组来执行此操作。代码运行正常,但分类变量似乎停留在我定义为testval的任何地方。

尝试1:

pm.switch()

尝试2:

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)

通过两次尝试,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)仅在第一次尝试中被采样为0,在第二次尝试中被采样为1(对应于给定的测试)。

我错误地认为b的分布没有按照我定义的分布进行抽样?

1 个答案:

答案 0 :(得分:1)

pymc3对nb使用不同的步骤方法,因为一个是离散的,另一个是连续的 - 它不能同时改变它们。开始时b为1,n为10.如果您建议将b更改为0,则logp会变小,因为n将为10 sd&# 39;从它的意思来说。对n的更改将被接受,但前提是它不会过多地离开10。如果b的变化得到合理的概率,它将不会接近于0。

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