2015-05-26 98 views
5

我需要對貝葉斯網絡進行一些推理,例如我在下面創建的示例。 Bayesian network貝葉斯網絡中的推理

我正在尋找像這樣的事情來解決諸如P(F | A = True,B = True)的推論。我最初的做法是像做

For every possible output of F 
    For every state of each observed variable (A,B) 
    For every unobserved variable (C, D, E, G) 
     // Calculate Probability 

但我不認爲這會工作,因爲我們確實需要許多變數一次走了過來,不是每一次。

我聽說過珍珠算法的消息傳遞,但我還沒有找到一個合理的描述,不是非常密集。爲了增加信息,這些貝葉斯網絡被約束爲不超過15-20個節點,並且我們有所有的條件概率表,這些代碼並不一定是快速或有效的。

基本上我正在尋找一種方法來做到這一點,不一定是最好的方式來做到這一點。

+0

你的圖只是一個例子,或者是所有觀察到的最高變量? –

+0

珍珠的消息傳遞算法只適用於網絡,但不循環。對於離散和高斯變量的循環網絡有精確的算法,但它們並不簡單。我的建議是找一些軟件做了計算,因此,所有你需要做的就是進入網絡描述(變量,連接和概率表),並運行查詢。這裏有商業和非商業軟件;對不起,我沒有推薦。 –

+0

圖表只是一個例子,頂部變量並不總是嚴格遵守 – suphug22

回答

0

你的BN似乎並不特別複雜,我認爲你應該很容易逃脫採用精確推理方法,如連接樹算法。當然,你仍然可以進行強力枚舉,但是這會浪費CPU資源,因爲有那麼多好的庫可以實現在圖形模型中進行精確和近似推斷的更智能的方法。

由於您的標籤提到C++,我的建議是libDAI。它是一個寫得很好的庫,它在通用因子圖上實現了多個精確和近似的推論。它沒有任何奇怪的依賴關係,並且很容易集成到您的項目中。它特別適用於您擁有概率表的離散案例,例如您的案例。

現在,你注意到我提到了因子圖。如果你對這個概念不熟悉,我會推薦你​​Wikipedia,但是原理很簡單。你應該代表你的國陣作爲一個因素圖,然後libDAI會爲你做推斷。

編輯:

由於CPU資源似乎並不成爲一個問題,你和簡單是關鍵,相反,你可以隨時用蠻力去枚舉。這個想法很簡單。您的貝葉斯網絡表示一個聯合概率分佈,您可以根據方程式(例如,

P(A,B,C) = P(A|B,C) * P(B|C) * P(C) 

假設你有你所有的條件概率分佈表,即P(A|B, C)P(B|C)P(C),那麼你可以簡單地去了所有的變量AB的可能值,並C和計算輸出。

+0

感謝您的幫助,我正在尋找不使用外部庫,網絡非常簡單,我想知道如果您說出確切的推理方法時,您是否可以詳細說明您的意思,我對這個主題仍然很陌生。 編輯 - 我不擔心這是浪費CPU資源,因爲這不是一個大型程序的一部分,只是程序本身和大多數節點只會承擔2-3個變量,也就是真,假,也許 – suphug22

+0

好吧,如果你正在尋找非常簡單的東西,你可以簡單地做一個你自己建議的暴力枚舉。做到這一點,如果需要太多時間回來這裏:) –

+0

請看我的編輯 –