这篇博客讲述的虽然全面,但细节部分,尤其是贝叶斯网络概率推导的具体实现部分,一笔带过。然而本次实验的要求就是实现贝叶斯网络的概率推导,因此我在学习完这篇博客的基础上,又把老师发的ppt学了一遍,(由于ppt是英文的,一开始我是拒绝学的),最后又挑重点看了下博客和ppt,感觉豁然开朗。
因此如果没有学习过贝叶斯网络,建议按照我上面列出的顺序学习。
由于ppt较大,因此这里以网盘形式给出,提取码:cn3h,该ppt仅供个人学习参考,严禁以盈利形式传播
关于贝叶斯网络的概率推导,最重要的公式是以下这两个:
这两个公式具体什么意思,网上或者是ppt中都有讲解,这里不再赘述。重点在于这两个公式是完成本实验代码的核心公式,这一点我在完成实验之后才意识到,在之前学习ppt的时候,由于公式众多,并没有意识到这两个公式的重要性。
实验代码
代码所在的github地址已给出
需要注意的是,由于该实验指定了数据格式,因此代码完全是在指定数据格式要求下完成的,不具有普适性,因此实验代码仅供参考算法使用。
设计的cpt格式如下:
class cpt:
def __init__(self, name, parents, probabilities):
self.name = name
self.parents = parents
self.probabilities = probabilities
贝叶斯网络代码如下
from cpt import cpt
class BN:
def __init__(self, nums, variables, graph, cpts):
self.nums = nums
self.variables = variables
self.graph = graph
self.cpts = cpts
# 创建一个名字与编号的字典,便于查找
index_list = [i for i in range(self.nums)]
self.variables_dict = dict(zip(self.variables, index_list))
# 计算全概率矩阵
self.TotalProbability = self.calculateTotalProbability()
def calcula