2017-04-21 41 views
0

我試圖建立一個簡單的貝葉斯網絡,其中雨水和噴灌是溼草的父母,但雨水和噴水器每個都有三個(模糊邏輯類型而不是通常的兩個布爾)狀態,而溼草有兩個狀態(真假)。我無法在pymc3文檔中的任何地方找到用於描述CPT的語法 - 我正在嘗試基於2狀態示例的以下內容,但它不是按照我認爲的方式推廣到三個狀態。任何人都可以顯示正確的方法來做到這一點? (也爲地方wetgrass有三種狀態也更普遍的情況)pymc3如何編碼多狀態離散貝葉斯網絡CPT?

rain = mc.Categorical('rain', p = np.array([0.5, 0. ,0.5])) 

sprinker = mc.Categorical('sprinkler', p=np.array([0.33,0.33,0.34])) 

wetgrass = mc.Categorical('wetgrass', 
    mc.math.switch(rain, 
     mc.math.switch(sprinker, 10, 1, -4), 
     mc.math.switch(sprinker, -20, 1, 3), 
     mc.math.switch(sprinker, -5, 1, -0.5))) 

[給人以wetgrass定義錯誤: 爲Switch.make_node輸入號碼錯誤(GOT 4((,,,))預計3) ]

據我瞭解 - 開關是一個theano函數類似於(b?a:b)在C程序中;這只是進行雙向比較。也許可以使用像這樣的二進制開關的整個負載來設置CPT,但我真的只想給出一個3D矩陣CPT作爲BNT和其他bayes網絡庫中的輸入。目前這可能嗎?

回答

1

您可以使用編碼兩個獨立開關的三路開關:

tt.switch(sprinker == 0, 
    10 
    tt.switch(sprinker == 1, 1, -4)) 

但總的來說它可能是更好的索引表:

table = tt.constant(np.array([[...], [...]])) 
value = table[rain, sprinker] 
+0

感謝 - 這是工作到定義網絡,但是我在運行採樣和logp計算時遇到了麻煩 - 不過現在我會問這是一個單獨的問題。 –

+0

新的問題和運行代碼,包括aseyboldt的答案是這裏:http://stackoverflow.com/questions/43540977/pymc3-mutli-category-bayesian-network-sampling-and-logp-calculate –