贝叶斯网络

贝叶斯公式

由乘法法则
P ( A B ) = P ( A ) P ( B ∣ A ) = P ( B ) P ( A ∣ B ) P(AB)=P(A)P(B|A)=P(B)P(A|B) P(AB)=P(A)P(BA)=P(B)P(AB)
可得:
P ( A ∣ B ) = P ( A ) P ( B ∣ A ) P ( B ) P(A|B)=\frac{P(A)P(B|A)}{P(B)} P(AB)=P(B)P(A)P(BA)
进一步地
P ( A i ∣ B ) = P ( B ∣ A i ) P ( A i ) ∑ j P ( B ∣ A j ) P ( A j ) P(A_i|B)=\frac{P(B|A_i)P(A_i)}{\sum_j{P(B|A_{j})P(A_j)}} P(AiB)=jP(BAj)P(Aj)P(BAi)P(Ai)
其中, A 1 , ⋯   , A n A_1,\cdots ,A_n A1,,An是完备事件组,即 ∪ i = 1 n A i = Ω , A i A j = ϕ , P ( A i ) > 0 \cup^{n}_{i=1}A_i=\Omega,A_iA_j=\phi,P(A_i)>0 i=1nAi=Ω,AiAj=ϕ,P(Ai)>0

贝叶斯网络

概念

贝叶斯网络是一种模拟人类推理过程中因果关系的不确定性处理模型,其网络拓扑结构是一个有向无环图。两个节点之间通过有向边连接,表示两个随机变量之间具有因果关系。

定义

假设有向无环图 G = ( I , E ) G=(I,E) G=(I,E) I I I是点集, E E E是有向边集;令
X = X i , i ∈ I X=X_i,i\in{I} X=Xi,iI
表示有向无环图 G G G的某一节点 i i i所代表的随机变量,若随机变量 X X X的联合概率可以表示成:
p ( x ) = ∏ i ∈ I p ( x i ∣ x p a r e n t ( i ) ) p(x)=\prod_{i{\in}I}p(x_i |x_{parent(i)}) p(x)=iIp(xixparent(i))
则称 X X X为相对有向无环图 G G G的贝叶斯网络,其中 X p a r e n t X_{parent} Xparent X X X的“因”,直接对任意的随机变量,其联合概率可由各自的局部条件概率分布相乘得到:
p ( x 1 , ⋯   , x k ) = p ( x k │ x 1 , ⋯   , x k − 1 ) ⋯ p ( x 2 ∣ x 1 ) p ( x 1 ) p(x_1,\cdots,x_k )=p(x_k│x_1,\cdots,x_{k-1}){\cdots}p(x_2 |x_1)p(x_1) p(x1,,xk)=p(xkx1,,xk1)p(x2x1)p(x1)

结构

head-to-head

由贝叶斯网络的定义,有
P ( a , b , c ) = P ( a ) P ( b ) P ( c ∣ a , b ) P(a,b,c)=P(a)P(b)P(c|a,b) P(a,b,c)=P(a)P(b)P(ca,b)
两边同时对随机变量 c c c积分
∑ c P ( a , b , c ) = ∑ c P ( a ) P ( b ) P ( c ∣ a , b ) ∑ c P ( a , b , c ) = P ( a ) P ( b ) ∑ c P ( c ∣ a , b ) P ( a , b ) = P ( a ) P ( b ) \sum_cP(a,b,c)=\sum_cP(a)P(b)P(c|a,b)\\ \sum_cP(a,b,c)=P(a)P(b)\sum_cP(c|a,b)\\ P(a,b)=P(a)P(b) cP(a,b,c)=cP(a)P(b)P(ca,b)cP(a,b,c)=P(a)P(b)cP(ca,b)P(a,b)=P(a)P(b)
即在 c c c未知的条件下, a a a b b b独立,称之为head-to-head条件独立。

tail-to-tail
由贝叶斯网络的定义,有

P ( a , b , c ) = P ( c ) P ( a ∣ c ) P ( b ∣ c ) P(a,b,c)=P(c)P(a|c)P(b|c) P(a,b,c)=P(c)P(ac)P(bc)

  • c c c未知, a a a b b b不独立;
  • c c c已知,有 P ( a , b ∣ c ) = P ( a , b , c ) P ( c ) = P ( c ) P ( a ∣ c ) P ( b ∣ c ) P ( c ) = P ( a ∣ c ) P ( b ∣ c ) P(a,b|c)=\frac{P(a,b,c)}{P(c)}=\frac{P(c)P(a|c)P(b|c)}{P(c)}=P(a|c)P(b|c) P(a,bc)=P(c)P(a,b,c)=P(c)P(c)P(ac)P(bc)=P(ac)P(bc) a a a b b b条件独立。
head-to-tail
由贝叶斯网络的定义,有

P ( a , b , c ) = P ( a ) P ( c ∣ a ) P ( b ∣ c ) P(a,b,c)=P(a)P(c|a)P(b|c) P(a,b,c)=P(a)P(ca)P(bc)

  • c c c未知, a a a b b b不独立;
  • c c c已知,有 P ( a , b ∣ c ) = P ( a , b , c ) P ( c ) = P ( a ) P ( c ∣ a ) P ( b ∣ c ) P ( c ) = P ( c ) P ( a ∣ c ) P ( b ∣ c ) P ( c ) = P ( a ∣ c ) P ( b ∣ c ) P(a,b|c)=\frac{P(a,b,c)}{P(c)}=\frac{P(a)P(c|a)P(b|c)}{P(c)}=\frac{P(c)P(a|c)P(b|c)}{P(c)}=P(a|c)P(b|c) P(a,bc)=P(c)P(a,b,c)=P(c)P(a)P(ca)P(bc)=P(c)P(c)P(ac)P(bc)=P(ac)P(bc) a a a b b b条件独立。
    x i x_i xi给定的条件下, x i + 1 x_{i+1} xi+1的分布和 x 1 , ⋯   , x i − 1 x_1,\cdots,x_{i-1} x1,,xi1条件独立,只和 x i x_i xi有关,和其他变量条件独立。即当前状态只跟前一时刻状态有关,这种顺次演变的随机过程,就是马尔科夫链(Markov chain)。

实现

主要依赖基于python的pgmpy库:GitHub 使用教程

网络拓扑结构
代码实现

引入相关的包

from pgmpy.models import BayesianModel
from pgmpy.factors.discrete.CPD import TabularCPD
from pgmpy.inference import VariableElimination

定义网络结构

# 边集
edge_list = [('A','C'),('A','D'),('C','F'),('C','E'),('B','D'),('D','E')]
# 定义网络结构
network = BayesianModel(edge_list)

定义变量之间的条件概率,入度为0的节点用先验概率进行信息表达

# variable 节点名称 variable_card 节点取值个数 values 节点的概率表 evidence 节点的父节点 evidence_card 父节点的取值个数
A_cpd = TabularCPD(variable='A', variable_card=2,
                   values=[[0.8], [0.2]])
                   
B_cpd = TabularCPD(variable='B', variable_card=2,
                   values=[[0.9], [0.1]])

C_cpd = TabularCPD(variable='C', variable_card=2,
                   values=[[0.8, 0.1], [0.2, 0.9]],
                   evidence=['A'], evidence_card=[2])

D_cpd = TabularCPD(variable='D', variable_card=2,
                   values=[[0.8, 0.2, 0.2, 0.1],
                           [0.2, 0.8, 0.8, 0.9]],
                   evidence=['A', 'B'],
                   evidence_card=[2, 2])

E_cpd = TabularCPD(variable='E', variable_card=2,
                   values=[[0.8, 0.2, 0.2, 0.1],
                           [0.2, 0.8, 0.8, 0.9]],
                   evidence=['C', 'D'],
                   evidence_card=[2, 2])

F_cpd = TabularCPD(variable='F', variable_card=2,
                   values=[[0.8, 0.1], [0.2, 0.9]],
                   evidence=['C'], evidence_card=[2])

把条件概率表加入到网络

network.add_cpds(A_cpd, B_cpd, C_cpd, D_cpd, E_cpd, F_cpd)

推理

# 推理,变量消除
inference = VariableElimination(network)
# 给定随机变量E
evidence_dict = {'E': 1}  
# 求A,B的概率
A_probability = inference.query(variables=['A'], evidence=evidence_dict)
B_probability = inference.query(variables=['B'], evidence=evidence_dict)

以上Demo是人为定义了网络结构,在实际应用中可以通过训练数据学习到网络结构

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值