我想構建一個依賴於其他分類變量的離散(pymc.Categorical)變量的貝葉斯網絡。 作爲simplest例如,假設變量一個和b是分類和b取決於一個如何使用pymc爲貝葉斯網絡製作條件概率表(CPT)
下面是一個試圖將其與pymc代碼(假設一個需要三個值中的一個和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可以採取狄氏變量的參數分類變量。 當Categorical變量得到一個Dirichlet變量作爲它的參數時,它知道期望一個k-1向量的概率,並假設第k個概率將向量加到1上。然而,當Dirichlet變量是輸出的確定性變量,這是我需要做一個CPT。
我對此有何看法?如何解決表達不匹配問題?我應該提到,我對pymc和Python比較陌生。
這一問題與上一個問題上making a discrete state Markov model with pymc
我也嘗試用pymc.Index替換selectedCPTLine的確定性變量定義,但這不能解決Dirichlet - 分類不兼容問題 – shpigi