【发布时间】:2014-05-13 12:56:09
【问题描述】:
我想建立一个依赖于其他分类变量的离散(pymc.Categorical)变量的贝叶斯网络。 以simplest 为例,假设变量 a 和 b 是分类变量,而 b 取决于 a
这里尝试使用 pymc 对其进行编码(假设 a 采用三个值之一,而 b 采用四个值之一)。想法是使用 pymc 从数据中学习 CPT 分布。
import numpy as np
import pymc as pm
aRange = 3
bRange = 4
#make variable a
a = pm.Categorical('a',pm.Dirichlet('aCPT',np.ones(aRange)/aRange))
#make a CPT table as an array of
CPTLines = np.empty(aRange, dtype=object)
for i in range(aRange):
CPTLines[i] = pm.Dirichlet('CPTLine%i' %i,np.ones(bRange)/bRange)
#make a deterministic node that holds the relevant CPT line (dependent on state1)
@pm.deterministic
def selectedCPTLine(CPTLines=CPTLines,a=a):
return CPTLines[a]
#make a node for variable b
b=pm.Categorical('b', selectedCPTLine)
model = pm.MCMC([a, b, selectedCPTLine])
如果我们绘制这个模型,它看起来像this
然而,运行这段代码我们得到一个错误:
Probabilities in categorical_like sum to [ 0.8603345]
显然,pymc 可以将 Dirichlet 变量作为 Categorical 变量的参数。 当 Categorical 变量将 Dirichlet 变量作为其参数时,它知道期望 k-1 个概率向量,并假设第 k 个概率将向量求和为 1。但是,当 Dirichlet 变量是一个确定性变量,这是我制作 CPT 所需要的。
我这样做是否正确?如何解决表示不匹配?我应该提一下,我对 pymc 和 Python 还比较陌生。
这个问题与making a discrete state Markov model with pymc上的一个问题有关
【问题讨论】:
-
我也尝试用 pymc.Index 替换 selectedCPTLine 的确定性变量定义,但这并不能解决 Dirichlet - 分类不兼容问题
标签: python bayesian-networks pymc dirichlet discrete-space