【读书笔记】概率图模型——基于R语言(一)

文章目录

  • 第一章:概率推理
    • 联合概率分布
    • 贝叶斯规则
      • 贝叶斯规则的第一个例子
      • 贝叶斯规则的第一个R语言例子
    • 概率图模型
      • 图和条件独立
      • 有向模型
      • 无向模型
      • 定义一个简单的图模型

第一章:概率推理

联合概率分布

  所谓联合概率分布,就是同时考虑多个(>=2)随机试验,考察这些试验之间的依赖关系。一个概率图模型就是一个联合概率分布,除此之外,并无他物。

  联合概率分布的一个重要概念是边缘化(Marginalization),当你考察几个随机变量的概率分布,即联合概率分布时,你也许想消去一些变量,得到较少变量的分布。即求联合分布P(X,Y)的边缘分布P(X):

P ( X ) = ∑ y P ( X , Y ) P(X)=\sum_{y}^{}P(X,Y) P(X)=yP(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(XY)=P(Y)P(X,Y)

以及

P ( Y ∣ X ) = P ( X , Y ) P ( X ) P(Y|X)=\frac{P(X,Y)}{P(X)} P(YX)=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(XY)=P(Y)P(YX)P(X)

在这个公式中,我们把 P ( X ∣ Y ) P(X|Y) P(XY)叫做给定Y下X的后验分布。因此我们也把 P ( X ) P(X) P(X)叫做先验分布。我们也把 P ( Y ∣ X ) P(Y|X) P(YX)叫做似然率 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(XY)P(Y)=P(YX)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)=xP(X,Y)=xP(YX)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(XY)=xP(YX)P(X)P(YX)P(X)

  这个公式之美,以至于我们只需要给定和使用 P ( Y ∣ X ) P(Y|X) P(YX) 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=goodM=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=badM=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=goodM=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=badM=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=brokenL=good)=P(L=goodM=broken)P(M=broken)+P(L=goodM=good)P(M=good)P(L=goodM=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.60.01+0.990.990.60.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.60.5+0.990.50.60.5=0.377

  机器有37.7%的概率故障,这就很高了

贝叶斯规则的第一个R语言例子

  我们不能只通过一次观测结果去判断机器好坏与否,贝叶斯派的做法是使用后验概率作为新的先验概率,并不断更新后验分布

# 定义列向量
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))

【读书笔记】概率图模型——基于R语言(一)_第1张图片

概率图模型

图和条件独立

  前面的例子中,我们有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(SSe,Cold)P(NSe,Cold)P(Cold)P(CCold)P(HCold)

其中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=1NP(Xipa(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=1Cφ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 

你可能感兴趣的:(概率图)