使用PYMC实施QMR-DT模型?

时间:2014-06-05 16:50:38

标签: pymc

我正在尝试使用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)

这导致下面显示的图形模型。

QMR-DT Model

我的问题是:

  1. 当疾病和发现节点的数量较大时,指定条件概率表的最佳方法是什么 - 大约15 - 20? pl.where方法不能很好地扩展。我在文档中遗漏了哪些内容可以实现更简单/可扩展的规范?

  2. 是否需要初始化未观察到的变量?我在网上看到了关于这一点的矛盾说明。

0 个答案:

没有答案