python - 如何使用 pymc 为贝叶斯网络制作条件概率表 (CPT)

标签 python bayesian-networks pymc dirichlet discrete-space

我想构建一个依赖于其他分类变量的离散 (pymc.Categorical) 变量的贝叶斯网络。 作为simplest例如,假设变量 ab 是分类变量并且 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 变量的参数。 当分类变量将 Dirichlet 变量作为其参数时,它知道期望 k-1 个概率向量,假设第 k 个概率将向量和为 1。但是,当 Dirichlet 变量是一个确定性变量,这是我制作 CPT 所需要的。

我的做法是否正确?如何解决表示不匹配问题?我应该提一下,我对 pymc 和 Python 比较陌生。

这个问题与之前关于 making a discrete state Markov model with pymc 的问题有关

最佳答案

好的,谢谢。问题是,虽然通常情况下,PyMC 会将 Dirichlet 识别为分类的父级并完成概率单纯形,但这里您的分类嵌入在容器中,并且分类不会进行所需的自动调整。以下代码为您完成此操作:

import numpy as np
import pymc as pm
aRange = 3
bRange = 4

aCPT = pm.Dirichlet('aCPT', np.ones(aRange))

#make variable a
a = pm.Categorical('a', aCPT)

#make a CPT table as an array of
CPTLines = [pm.Dirichlet('CPTLine%i' %i, np.ones(bRange)) for i in range(aRange)]

#make a node for variable b
@pm.stochastic(dtype=int)
def b(value=0, CPT=CPTLines, a=a):
    return pm.categorical_like(value, p=pm.extend_dirichlet(CPT[a]))

model = pm.MCMC([a, b, CPTLines])

希望对您有所帮助。

关于python - 如何使用 pymc 为贝叶斯网络制作条件概率表 (CPT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22808110/

相关文章:

matlab - 将 WEKA 模型导入 MATLAB

python - PYMC3 季节性变量

python - pymc3 中的后采样

python - 用莫顿代码找到最近的邻居

python - 在每个循环迭代中创建新的 pandas 数据框

python - Keras 模型预测同一类别

machine-learning - 从设备日志数据中提取模式

python - 索引上的 bool 索引(而不是数据帧)

python - 来自石榴贝叶斯网络的样本

python - 在 PYMC3 中求解 ODE