【问题标题】:How to make Conditional Probability Tables (CPTs) for Bayesian networks with pymc如何使用 pymc 为贝叶斯网络制作条件概率表 (CPT)
【发布时间】:2014-05-13 12:56:09
【问题描述】:

我想建立一个依赖于其他分类变量的离散(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 变量的参数。 当 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


【解决方案1】:

好的,谢谢。问题是,虽然通常 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])

希望对您有所帮助。

【讨论】:

  • 看起来这就是我需要的!为什么 b 的定义返回的任何想法:“零概率:随机 b 的值超出其支持范围,或者它禁止其父项的当前值。” ?
  • 表示存在无效值,例如超出分类变量范围的整数。
  • 正确。缺少 dtype=int。现在可以了,谢谢!
【解决方案2】:

几个混淆点:

  • 您的模型似乎不包含任何数据(观察到的随机变量),因此没有适合模型的信息
  • 不确定作为确定性输出的 Dirichlet 变量是什么意思。只要概率的长度为 k-1 并且它们的总和小于 1,那么您应该是好的。如果你有一个总和为单位的值,你可以只传递值的前 k-1 个。

【讨论】:

  • 感谢您查看此内容。 * 我的模型不包含数据,因为我将一些简单的东西放在一起作为示例。在现实世界的问题中,会有更多的变量,有些人会观察到会驱动其余部分分布的数据。
  • 关于您的第二点:我有一个确定性函数 (selectCPTLine),它采用 Dirichlet 变量数组和一个分类变量,用于选择哪个 Dirichlet 变量是函数的输出。所以该函数返回一个狄利克雷变量。我想我应该写“确定性函数”,而不是“变量”。希望这能澄清我正在尝试做的事情。
猜你喜欢
  • 1970-01-01
  • 2018-05-29
  • 1970-01-01
  • 2022-06-11
  • 1970-01-01
  • 1970-01-01
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多