2015-05-26 101 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

请看我的编辑 –