我正在尝试使用PyMC实现QMR-DT模型(link here)。
我使用下面的代码设置了一个简单的模型。
qmr-dt model
import pylab as pl
import pymc
# F0 and F1 are the findings, and D1, D2, D3 are the diseases.
F0_obs = [0.]
F1_obs = [1.]
N = len(F0_obs)
D1 = pymc.Bernoulli('Diagnosis_1', 0.80, value=pl.ones(N))
D2 = pymc.Bernoulli('Diagnosis_2', 0.50, value=pl.ones(N))
D3 = pymc.Bernoulli('Diagnosis_3', 0.80, value=pl.ones(N))
# This represents the following CPT
# D2, D1: (False, False = 0.01), (False, True = 0.5), (True, False = 0.99), (True, True = 0.99)
p_F0 = pymc.Lambda('p_Finding_0', lambda D1=D1, D2=D2:
pl.where(D2, pl.where(D1, 0.99, 0.99), pl.where(D1, 0.5, 0.01)),
doc='Pr[F0|D1,D2]')
# D3, D2: (False, False = 0.01), (False, True = 0.6), (True, False = 0.7), (True, True = 0.99)
p_F1 = pymc.Lambda('p_Finding_1', lambda D1=D1, D3=D3:
pl.where(D3, pl.where(D1, 0.99, 0.7), pl.where(D1, 0.6, 0.01)),
doc='Pr[F1|D1,D3]')
F0 = pymc.Bernoulli('Finding_0', p_F0, value=F0_obs, observed=True)
F1 = pymc.Bernoulli('Finding_1', p_F1, value=F1_obs)
这导致下面显示的图形模型。
我的问题是:
当疾病和发现节点的数量较大时,指定条件概率表的最佳方法是什么 - 大约15 - 20? pl.where方法不能很好地扩展。我在文档中遗漏了哪些内容可以实现更简单/可扩展的规范?
是否需要初始化未观察到的变量?我在网上看到了关于这一点的矛盾说明。