所谓联合概率分布,就是同时考虑多个(>=2)随机试验,考察这些试验之间的依赖关系。一个概率图模型就是一个联合概率分布,除此之外,并无他物。
联合概率分布的一个重要概念是边缘化(Marginalization),当你考察几个随机变量的概率分布,即联合概率分布时,你也许想消去一些变量,得到较少变量的分布。即求联合分布P(X,Y)的边缘分布P(X):
P ( X ) = ∑ y P ( X , Y ) P(X)=\sum_{y}^{}P(X,Y) P(X)=y∑P(X,Y)
按照y所有可能的取值汇总概率 。通过这个操作可以直接从P(X,Y)中消除Y,当y为连续值时可以写做:
P ( X ) = ∫ y P ( X , y ) d y P(X)=\int_{y}^{}P(X,y)dy P(X)=∫yP(X,y)dy
条件概率更形式化的公式:
P ( X ∣ Y ) = P ( X , Y ) P ( Y ) P(X|Y)=\frac{P(X,Y)}{P(Y)} P(X∣Y)=P(Y)P(X,Y)
P ( Y ∣ X ) = P ( X , Y ) P ( X ) P(Y|X)=\frac{P(X,Y)}{P(X)} P(Y∣X)=P(X)P(X,Y)
从而可以轻松地推出贝叶斯公式:
P ( X ∣ Y ) = P ( Y ∣ X ) P ( X ) P ( Y ) P(X|Y)=\frac{P(Y|X)P(X)}{P(Y)} P(X∣Y)=P(Y)P(Y∣X)P(X)
在这个公式中,我们把 P ( X ∣ Y ) P(X|Y) P(X∣Y)叫做给定Y下X的后验分布。因此我们也把 P ( X ) P(X) P(X)叫做先验分布。我们也把 P ( Y ∣ X ) P(Y|X) P(Y∣X)叫做似然率, P ( Y ) P(Y) P(Y)叫做归一化因子。这个公式是最重要的公式,是拉普拉斯生涯的杰作,是现代科学最重要的公式之一。然而它也非常简单。
我们再解释一下归一化因子:
P ( X , Y ) = P ( X ∣ Y ) P ( Y ) = P ( Y ∣ X ) P ( X ) P(X,Y)=P(X|Y)P(Y)=P(Y|X)P(X) P(X,Y)=P(X∣Y)P(Y)=P(Y∣X)P(X)
P ( Y ) = ∑ x P ( X , Y ) = ∑ x P ( Y ∣ X ) P ( X ) P(Y)=\sum_{x}{}P(X,Y)=\sum_{x}{}P(Y|X)P(X) P(Y)=x∑P(X,Y)=x∑P(Y∣X)P(X)
代入得到贝叶斯公式的一般形式:
P ( X ∣ Y ) = P ( Y ∣ X ) P ( X ) ∑ x P ( Y ∣ X ) P ( X ) P(X|Y)=\frac{P(Y|X)P(X)}{\sum_{x}{}P(Y|X)P(X)} P(X∣Y)=∑xP(Y∣X)P(X)P(Y∣X)P(X)
这个公式之美,以至于我们只需要给定和使用 P ( Y ∣ X ) P(Y|X) P(Y∣X)和 P ( X ) P(X) P(X),也就是给定似然率和先验概率就可以计算出给定Y下X的后验概率。但是分母求和是一个棘手的问题,复杂的问题也需要先进的技术。
定义一个刻画机器状态的随机变量M,M有两个状态{working,broken},先验分布:
P ( M = w o r k i n g ) = 0.99 P(M=working)=0.99 P(M=working)=0.99
P ( M = b r o k e n ) = 0.01 P(M=broken)=0.01 P(M=broken)=0.01
第二个变量L,表示机器生产的灯泡,也包含两个状态{good,bad},给定一组(比如说是观测值)似然率:
P ( L = g o o d ∣ M = w o r k i n g ) = 0.99 P(L=good|M=working)=0.99 P(L=good∣M=working)=0.99
P ( L = b a d ∣ M = w o r k i n g ) = 0.01 P(L=bad|M=working)=0.01 P(L=bad∣M=working)=0.01
P ( L = g o o d ∣ M = b r o k e n ) = 0.6 P(L=good|M=broken)=0.6 P(L=good∣M=broken)=0.6
P ( L = b a d ∣ M = b r o k e n ) = 0.4 P(L=bad|M=broken)=0.4 P(L=bad∣M=broken)=0.4
下面计算:
P ( M = b r o k e n ∣ L = g o o d ) = P ( L = g o o d ∣ M = b r o k e n ) P ( M = b r o k e n ) P ( L = g o o d ∣ M = b r o k e n ) P ( M = b r o k e n ) + P ( L = g o o d ∣ M = g o o d ) P ( M = g o o d ) P(M=broken|L=good)=\frac{P(L=good|M=broken)P(M=broken)}{P(L=good|M=broken)P(M=broken)+P(L=good|M=good)P(M=good)} P(M=broken∣L=good)=P(L=good∣M=broken)P(M=broken)+P(L=good∣M=good)P(M=good)P(L=good∣M=broken)P(M=broken)
= 0.6 ∗ 0.01 0.6 ∗ 0.01 + 0.99 ∗ 0.99 = 0.0061 ~~~~~~~~~~~~~=\frac{0.6*0.01}{0.6*0.01+0.99*0.99}=0.0061 =0.6∗0.01+0.99∗0.990.6∗0.01=0.0061
正如所见,到灯泡是好的情况下,机器故障的概率是0.061%
让我们计算同样的问题,机器正常与否的先验概率变成0.5,结果变成:
0.6 ∗ 0.5 0.6 ∗ 0.5 + 0.99 ∗ 0.5 = 0.377 \frac{0.6*0.5}{0.6*0.5+0.99*0.5}=0.377 0.6∗0.5+0.99∗0.50.6∗0.5=0.377
机器有37.7%的概率故障,这就很高了
我们不能只通过一次观测结果去判断机器好坏与否,贝叶斯派的做法是使用后验概率作为新的先验概率,并不断更新后验分布
# 定义列向量
prior <-c(working=0.99, broken=0.01)
# 定义似然率矩阵
likehood <-rbind(
working =c(good=0.99, bad=0.01),
broken =c(good=0.6, bad=0.4))
# 定义输入数据顺序
data <-c("bad", "bad", "bad", "bad")
# 定义一个更新先验概率的函数
bayes <-function(prior, likehood, data){
posterior <-matrix(0, nrow =length(data), ncol =length(prior))
dimnames(posterior) <-list(data, names(prior))
prior_bak <-prior
for (i in 1:length(data)){
posterior[i, ] <-prior * likehood[, data[i]]/
sum(prior * likehood[, data[i]])
prior <-posterior[i, ]
}
return(rbind(prior_bak, posterior))
}
matplot(bayes(prior, likehood, data), t ='b', lty =1, pch =20, col =c(3,2))
前面的例子中,我们有X,Y两个变量,给出的似然率4个,当有20个变量时,我们就需要给出 2 20 2^{20} 220个值,建模任务几乎变得不可能,怎么减少参数量呢,我们可以做条件独立假设例如:
P ( S e , N , H , S , C , C o l d ) = P ( S e ) P ( S ∣ S e , C o l d ) P ( N ∣ S e , C o l d ) ∗ P ( C o l d ) P ( C ∣ C o l d ) P ( H ∣ C o l d ) P(Se,N,H,S,C,Cold) \\ =P(Se)P(S|Se,Cold)P(N|Se,Cold)*P(Cold)P(C|Cold)P(H|Cold) P(Se,N,H,S,C,Cold)=P(Se)P(S∣Se,Cold)P(N∣Se,Cold)∗P(Cold)P(C∣Cold)P(H∣Cold)
其中Se:季节;N:鼻子堵塞;H:头痛;S:打喷嚏;C:咳嗽;Cold:感冒
P ( X 1 , . . . , X n ) = ∏ i = 1 N P ( X i ∣ p a ( X i ) ) P(X1, ...,Xn)=\prod_{i=1}^{N}P(Xi|pa(Xi)) P(X1,...,Xn)=i=1∏NP(Xi∣pa(Xi))
p a ( X i ) pa(Xi) pa(Xi)是 X i Xi Xi父变量的子集,有向图A指向B,A就是B的父变量。
P ( X 1 , . . . , X n ) = 1 Z ∏ c = 1 C φ i ( χ i ) P(X1, ...,Xn)=\frac{1}{Z}\prod_{c=1}^{C}φi(\chi i) P(X1,...,Xn)=Z1c=1∏Cφi(χi)
Z归一化因子, χ i \chi i χi是无向图的一个极大团, φ i φi φi是极大团因子的函数。
首先安装库gRain、gRbase、Rgraphviz
# 定义两个随机变量
M_val <-c("working", "broken")
L_val <-c("good", "bad")
# ensure the relationship of positions
M_prob <-c(99 ,1)
L_prob <-c(99, 1, 60, 40)
# use gRain variable,cptable define conditional prob
M <-cptable(~machin, values = M_prob, levels = M_val)
L <-cptable(~light |machine, values = L_prob, levels = L_val)
Plist <-compileCPT(list(M, L))
Plist
Plist$machine
Plist$light
# compute posterior prob
net <-grain(Plist)
net_evi <-setEvidence(net, evidence = list(light ="bad"))
querygrain(net_evi, nodes = c("machine"))
以上代码会产生如下结果
> Plist
CPTspec with probabilities:
P( machine )
P( light | machine )
> Plist$machine
machine
working broken
0.99 0.01
attr(,"class")
[1] "parray" "array"
> Plist$light
machine
light working broken
good 0.99 0.6
bad 0.01 0.4
attr(,"class")
[1] "parray" "array"
> querygrain(net_evi, nodes = c("machine"))
$machine
machine
working broken
0.7122302 0.2877698