贝叶斯网络
一、原理
贝叶斯网络概述
贝叶斯网络(Bayesian Network,BN)作为一种概率图模型(Probabilistic Graphical Model,PGD),可以通过有向无环图(Directed Acyclic Graph,DAG)来表现。因为概率图模型是用图来表示变量概率依赖关系的模型,结合概率论与图论的知识,利用图来表示与模型有关的变量的联合概率分布。在处理实际问题时,如果我们希望在数据中挖掘隐含的知识,可以通过概率图模型构建一幅图的方式实现,具体实现就是用观测结点表示观测到的数据,用隐含结点表示潜在的知识,用边来描述知识与数据的相互关系,最后基于这样的关系图获得一个概率分布。概率图中的节点分为隐含节点和观测节点,边分为有向边和无向边。从概率论的角度,节点对应于随机变量,边对应于随机变量的依赖或相关关系,其中有向边表示单向的依赖或者说存在因果关系,无向边表示相互依赖关系。
贝叶斯网络是一种模拟人类推理过程中因果关系的不确定性处理模型,它是一个有向无环图,它的节点表示的是一些随机变量,这些随机变量有些可以观测到的,有些无法观测到的。无环表示在信息流动的过程中有一个确定的方向的。当一件事物发生的时候,另一件事情更容易发生,这时候就用概率来表达,而且这种概率通常表达的是因果关系。
贝叶斯网络是一种模拟人类推理过程中因果关系的不确定性处理模型,也是一些变量的联合概率分布的图形表示。通常包含两个部分,一个是贝叶斯网络结构图,它是一个有向无环图(DAG),其中图中的每个节点代表相应的变量,节点之间的连接关系代表了贝叶斯网络的条件独立语义。另一部分,就是节点和节点之间的条件概率表(CPT),也就是一系列的概率值。如果一个贝叶斯网络提供了足够的条件概率值,足以计算任何给定的联合概率,我们就称,它是可计算的,即可推理的。
贝叶斯推断,使用贝叶斯方法处理不确定性,需要利用贝叶斯定理将先验分布更新至后验分布中,这无疑是最流行的方法之一。但还存在其他非贝叶斯方法,例如集中不等式就是非贝叶斯方法,它们允许计算置信区间和不确定性集合。
贝叶斯网络定义
贝叶斯网络是一个有向无环图(Directed Acyclic Graph, DAG),由代表变量节点及连接这些节点有向边构成。其中节点代表随机变量,节点间的有向边代表了节点间的互相关系(由父节点指向其子节点),用条件概率表达变量间依赖关系,没有父节点的用先验概率进行信息表达。
令 G 为定义在{x_1,x_2,...,x_n}上的一个贝叶斯网络,其联合概率分布可以表示为各个 节点的条件概率分布的乘积:
二、实例
手动计算
python 计算
from pgmpy.inference import VariableElimination
from pgmpy.factors.discrete import TabularCPD
from pgmpy.models import BayesianNetwork
from rich import print
bayes_model = BayesianNetwork([('X', 'Y'),
('Y', 'Z'),
('Z', 'W')])
# TabularCPD通过TabularCPD构造条件概率分布CPD(condition probability distribution)表格
# 最后将CPD数据添加到贝叶斯网络结构中,完成贝叶斯网络的构造。
# 设置参数
x = TabularCPD(variable='X', #variable:节点变量名称是'X'
variable_card=2, #variable_card:变量的可能结果有2种(0 or 1)
values=[[0.4], [0.6]]) #values:两种结果的概率值
y = TabularCPD( variable='Y', variable_card=2,
values=[[0.9,0.8],
[0.1,0.2]],
evidence=['X'], # evidence:父节点变量名称
evidence_card=[2])# 父节点有几个,分别有几种结果(当只有一个父节点时[]内只填写几种结果)
z = TabularCPD(variable='Z', variable_card=2,
values=[[0.7,0.4],
[0.3,0.6]],
evidence=['Y'], evidence_card=[2])
w = TabularCPD(variable='W', variable_card=2,
values=[[0.5,0.6],
[0.5,0.4]],
evidence=['Z'],evidence_card=[2])
bayes_model.add_cpds(x,y,z,w)
# 测试网络结构是否正确
print(bayes_model.check_model())
# 变量消除法是精确推断的一种方法.
# 使用建立好的贝叶斯网络进行推理
asia_infer = VariableElimination(bayes_model)
print('X',asia_infer.query(variables=['X'])) # 计算variables的概率
print('Y',asia_infer.query(variables=['Y'])) # 计算variables的概率
print('Z',asia_infer.query(variables=['Z'])) # 计算variables的概率
print('W',asia_infer.query(variables=['W'])) # 计算variables的概率
print('P(w1|x1)=',asia_infer.query(variables=['W'], evidence={'X': 1})) # 计算evidence前提下的variables的概率
print('P(x1|w1)=',asia_infer.query(variables=['X'], evidence={'W': 1})) # 计算evidence前提下的variables的概率
得到的结果
X
+------+----------+
| X | phi(X) |
+======+==========+
| X(0) | 0.4000 |
+------+----------+
| X(1) | 0.6000 |
+------+----------+
Y
+------+----------+
| Y | phi(Y) |
+======+==========+
| Y(0) | 0.8400 |
+------+----------+
| Y(1) | 0.1600 |
+------+----------+
Z
+------+----------+
| Z | phi(Z) |
+======+==========+
| Z(0) | 0.6520 |
+------+----------+
| Z(1) | 0.3480 |
+------+----------+
W
+------+----------+
| W | phi(W) |
+======+==========+
| W(0) | 0.5348 |
+------+----------+
| W(1) | 0.4652 |
+------+----------+
P(w1|x1)=
+------+----------+
| W | phi(W) |
+======+==========+
| W(0) | 0.5360 |
+------+----------+
| W(1) | 0.4640 |
+------+----------+
P(x1|w1)=
+------+----------+
| X | phi(X) |
+======+==========+
| X(0) | 0.4015 |
+------+----------+
| X(1) | 0.5985 |
+------+----------+