贝叶斯公式
由乘法法则
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(B∣A)=P(B)P(A∣B)
可得:
P
(
A
∣
B
)
=
P
(
A
)
P
(
B
∣
A
)
P
(
B
)
P(A|B)=\frac{P(A)P(B|A)}{P(B)}
P(A∣B)=P(B)P(A)P(B∣A)
进一步地
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(Ai∣B)=∑jP(B∣Aj)P(Aj)P(B∣Ai)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,i∈I
表示有向无环图
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)=i∈I∏p(xi∣xparent(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(xk│x1,⋯,xk−1)⋯p(x2∣x1)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(c∣a,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)
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)
即在
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(a∣c)P(b∣c)
- 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,b∣c)=P(c)P(a,b,c)=P(c)P(c)P(a∣c)P(b∣c)=P(a∣c)P(b∣c), 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(c∣a)P(b∣c)
- 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,b∣c)=P(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(a∣c)P(b∣c),
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,⋯,xi−1条件独立,只和 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是人为定义了网络结构,在实际应用中可以通过训练数据学习到网络结构