我最近开始使用 PyMC3 进行概率编程。在我的场景中,我有 3 个随机变量:On、Triangle 和 X,这样 X 取决于 Triangle 和 On。Triangle 和 On 都遵循 Bernoulli 分布,并且根据它们所取的值,遵循 Normal 的 X 的值会发生变化。
我写了一些模拟代码来测试这个概念,代码不好,主要是因为你不能调用numpy.isnan()
PyMC3 发行版。我刚开始在这个框架中工作,我知道我不是在编写可以运行的代码,但是我在这里发布这个,以便你可以看到我做了什么。
with pymc3.Model() as model:
on = pymc3.distributions.discrete.Bernoulli('on', p=.7)
x_on = pymc3.distributions.continuous.Normal('x_on', 10, .4)
pTriangle_given_on = 1
pTriangle_given_not_on = .7
pTriangle = pymc3.math.switch(on, pTriangle_given_on, pTriangle_given_not_on)
triangle = pymc3.distributions.discrete.Bernoulli('triangle', p=pTriangle)
name = None
x_triangle = None
if triangle:
name = pymc3.distributions.discrete.Categorical('name', p=[.3, .2, .1, .1, .2, .1])
else:
name = pymc3.distributions.discrete.Categorical('name', p=[.1, .5, .4])
if on:
x_triangle = pymc3.Deterministic('x_triangle', x_on)
elif triangle:
x_triangle = pymc3.Normal('x_triangle', 5, 1)
else:
x_triangle = numpy.nan
trace = pymc3.sample()
pymc3.plot_posterior(trace)
我不确定如何指定 X 对 Triangle 和 On 的条件依赖。大家的任何想法都将不胜感激。