我正在尝试使用分类变量作为索引,从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
的分布没有按照我定义的分布进行抽样?
答案 0 :(得分:1)
pymc3对n
和b
使用不同的步骤方法,因为一个是离散的,另一个是连续的 - 它不能同时改变它们。开始时b
为1,n
为10.如果您建议将b
更改为0,则logp会变小,因为n
将为10 sd&# 39;从它的意思来说。对n
的更改将被接受,但前提是它不会过多地离开10。如果b
的变化得到合理的概率,它将不会接近于0。
典型的后验集合可以分为两个区域(类似{0} \次[-a,+ a]和{1} \次[10-a,10 + a]),采样器可以& #39;在它们之间移动:多模态的一些离散版本。