我需要在贝叶斯网络上执行一些推断,例如下面创建的示例。
我正在考虑做类似这样的事情来解决诸如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
但是我认为这行不通,因为我们实际上需要一次遍历多个变量,而不是一次遍历每个变量。
我听说过用于消息传递的Pearls算法,但是还没有找到一个合理的描述,它不是非常密集。为了获得更多信息,这些贝叶斯网络被限制为不超过15-20个节点,并且我们拥有所有条件概率表,代码实际上并不一定必须快速或高效。
基本上,我正在寻找一种方法来执行此操作,而不一定是执行此操作的最佳方法。
最佳答案
您的贝叶斯网络(BN)似乎并不特别复杂。我认为您应该轻松地使用精确的推断方法,例如j unction tree algorithm。当然,您仍然可以只进行蛮力枚举,但这会浪费CPU资源,因为那里有很多漂亮的库可以实现在图形模型中执行精确和近似推断的更智能方法。
由于您的标记中提到了C++,所以我的建议是libDAI。它是一个编写良好的库,可以对通用因子图实现多个精确和近似推断。它没有任何奇怪的依赖关系,并且很容易集成到您的项目中。它特别适用于您拥有概率表的离散案例,例如您的案例。
现在,您注意到我提到了因子图。如果您不熟悉该概念,那么我将同时介绍Wikipedia article on factor graphs和What are "Factor Graphs" and what are they useful for?。原理很简单,您将BN表示为因子图,然后libDAI将为您进行推断。
编辑:
由于CPU资源似乎对您来说不是问题,而简单性是关键,因此您始终可以使用蛮力枚举。这个想法很简单。
您的贝叶斯网络代表一个 union 概率分布,您可以根据等式写下该分布,例如
P(A,B,C) = P(A|B,C) * P(B|C) * P(C)
假设您有所有条件概率分布的表,即
P(A|B, C)
P(B|C)
和P(C)
,那么您可以简单地遍历变量A
,B
和C
的所有可能值并计算输出。