贝叶斯网的R实现( Bayesian networks in R)bnlearn
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
贝叶斯网的R实现(Bayesian networks in R)(二)bnlearn(1)
2013-06-14 21:33:22
1.bayesian networks的一些基本概念
贝叶斯网bayesian networks是一种有向无环图模型(DAG),可表示为G=(V,A)。
其中V 是节点的集合,节点表示随机变量;A是弧(或称为边)的集合,弧的箭头表示随机变量之间的概率相依性。
有向无环图DAG定义了一个因子化的V中全体节点的联合概率分布,称为全局概率分布;相对的,与每个随机变量关联的,为局部概率分布。
因子化的形式由贝叶斯网的马尔科夫性质给出,对每个随机变量,其概率只依赖于其父代:
可以通过学习算法得到贝叶斯网的结构。
学习算法首先是学习网络结构,然后在此基础上估计局部分布函数的参数。
尽管全局和局部分布的选择形式很多,最常用的还是下面的两种分布:多项分布(离散数据)多元正态分布(连续分布)
得到网络结构,可以利用概率的条件相依,对相关专业问题进行推断。
R中有多个包可以实现贝叶斯网的创建、学习和推断,详见下面表格。
前面我曾简单介绍过gRain包,本篇讨论最常用的bnlearn包。
2.网络创建和操作bnlearn包自带数据集marks,88学生5门课的成绩。
这个数据最早由Mardia et al(1979)研究过。
library(bnlearn)
## Warning: package 'bnlearn' was built under R version 3.0.1
data(marks)
str(marks)
## 'data.frame': 88 obs. of 5 variables:
## $ MECH: num 77 63 75 55 63 53 51 59 62 64 ...
## $ VECT: num 82 78 73 72 63 61 67 70 60 72 ...
## $ ALG : num 67 80 71 63 65 72 65 68 58 60 ...
## $ ANL : num 67 70 66 70 70 64 65 62 62 62 ...
## $ STAT: num 81 81 81 68 63 73 68 56 70 45 ...
创建一个空网络,节点对应于marks的变量。
然后通过指派一个两列的矩阵来添加边。
生成一个无向图:
ug <- empty.graph(names(marks))
arcs(ug, ignore.cycles = TRUE) = matrix(c("MECH", "VECT", "MECH", "ALG", "VECT",
"MECH", "VECT", "ALG", "ALG", "MECH", "ALG", "VECT", "ALG", "ANL", "ALG",
"STAT", "ANL", "ALG", "ANL", "STAT", "STAT", "ALG", "STAT", "ANL"), ncol = 2,
byrow = TRUE, dimnames = list(c(), c("from", "to")))
ug
##
## Random/Generated Bayesian network
##
## model:
## [undirected graph]
## nodes: 5
## arcs: 6
## undirected arcs: 6
## directed arcs: 0
## average markov blanket size: 2.40
## average neighbourhood size: 2.40
## average branching factor: 0.00
##
## generation algorithm: Empty
这个ug对象属于bn类,这个类用于在bnlearn包中管理网络结构。
这个对象包括三个方面的信息:
(1)learning:结构的学习(2)node 节点(3)arc 边
生成一个有向图:
dg <- empty.graph(names(marks))
arcs(dg) = matrix(c("VECT", "MECH", "ALG", "MECH", "ALG", "VECT", "ANL", "ALG",
"STAT", "ALG", "STAT", "ANL"), ncol = 2, byrow = TRUE, dimnames = list(c(),
c("from", "to")))
dg
##
## Random/Generated Bayesian network
##
## model:
## [STAT][ANL|STAT][ALG|ANL:STAT][VECT|ALG][MECH|VECT:ALG]
## nodes: 5
## arcs: 6
## undirected arcs: 0
## directed arcs: 6
## average markov blanket size: 2.40
## average neighbourhood size: 2.40
## average branching factor: 1.20
##
## generation algorithm: Empty
有时候也可以从邻接矩阵(adjacency matrix)来生成有向图dg。
mat <- matrix(c(0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1,
0, 0, 0, 0, 0), nrow = 5, dimnames = list(nodes(dg), nodes(dg)))
mat
## MECH VECT ALG ANL STAT
## MECH 0 0 0 0 0
## VECT 1 0 0 0 0
## ALG 1 1 0 0 0
## ANL 0 0 1 0 0
## STAT 0 0 1 1 0
dg2 <- empty.graph(nodes(dg))
amat(dg2) <- mat
all.equal(dg, dg2)
## [1] TRUE
手工修改一个已经存在的网络,利用加边(set.arc)、去边(drop.arc)、颠倒(rev.arc)这几个操作,也可以得到一个需要的网络。
dg3 <- empty.graph(nodes(dg))
dg3 <- set.arc(dg3, "VECT", "MECH")
dg3 <- set.arc(dg3, "ALG", "MECH")
dg3 <- set.arc(dg3, "ALG", "VECT")
dg3 <- set.arc(dg3, "ANL", "ALG")
dg3 <- set.arc(dg3, "STAT", "ALG")
dg3 <- set.arc(dg3, "STAT", "ANL")
all.equal(dg, dg3)
## [1] TRUE
all.equal(ug, moral(dg)) #moral图
## [1] TRUE
我们全面希望了解网络的结构,可以使用存储在每个节点的信息。
(1)节点的拓扑顺序
node.ordering(dg)
## [1] "STAT" "ANL" "ALG" "VECT" "MECH"
(2)节点的邻居(nbr)和Markov毯(mb)
Markov毯是指对一个节点A,它的所有父节点,子节点以及和A有相同子节点的其它节点。
nbr(dg, "STAT")
## [1] "ALG" "ANL"
mb(dg, "STAT")
## [1] "ALG" "ANL"
"ANL" %in% mb(dg, "STAT")
## [1] TRUE
"STAT" %in% mb(dg, "ANL")
## [1] TRUE
(3)某个给定节点的子代(child)和父代(parents)和子代的其它父代(o.par)
child <- children(dg, "STAT")
pa <- parents(dg, "STAT")
2.绘制网络
bnlearn包有两种对bn对象绘制网络结构的方法,一种是利用graph包和Rgraphviz包提供的接口给出的一些绘图函数,比如graphviz.plot。
再一种方法是利用plot函数。
下面对于dg,来绘制网络图。
使用graphviz.plot的好处在于它返回一个graph对象,便于对网络的进一步操作。
library(Rgraphviz)
graphviz.plot(dg, layout = "fdp")
plot(dg, radius = 200, arrow = 30)
贝叶斯网的R实现(Bayesian networks in R)(二)bnlearn(2)
2013-06-17 23:12:41
3.结构学习
上面我们采用一个预先设定的结构建立了一个关于marks的贝叶斯网。
这种方式在某些情况下(比如存在先验的专家知识)是合适的。
但是对大多数的贝叶斯网络,我们需要从数据中学习网络。
3.1贝叶斯网的结构简介
贝叶斯网关于节点(随机变量)的条件依赖或条件独立可以从图的角度讨论节点之间的连通
与分割。
如果两个节点A,B直接相连,它们之间存在直接依赖关系。
若两个节点不是直接相连的,要么A和B之间没有任何联系,即条件独立;要么可以通过其它节点在A,B之间建立起来联系,即条件依赖。
下面考虑两个节点A和B通过第三个节点C间接连接的情况,这有3种基本情形:
按图中顺序,自上到下分别成为:分连(diverging connection)顺连(serial connection)汇连(converging connection)
对这三种连接形式,当给定节点C时,可以由贝叶斯网的Markov 性质解释条件依赖的情况:
分连:P(A,B,C)=P(B|C)P(A|C)P(C)
顺连:P(A,B,C)=P(B|C)P(C|A)P(A)
汇连:P(A,B,C)=P(C|A,B)P(B)P(A) 对节点A,B分连和顺连是条件独立的,汇连是条件依
赖的(C依赖于AB的联合分布)。
汇连这种情况也称为一个v-结构。
设X,Y,Z是3个不相交的节点集合,若在X,Y之间有一个节点V满足下列之一:(1)V 在Z中且没有汇连(2)V有一条汇连的边,且V或它的子代都不在Z中,称Z d-分隔A,B(也称有向分隔)。
此时,若Z已知,则X和Y在给定Z时条件独立。
3.2结构学习算法
结构学习算法可分为三类:基于约束的算法、基于得分的算法以及混合算法。
3.2.1基于约束的算法基于约束的算法的基本想法是,节点A,B在节点C给定的条件下,是否满足条件独立。
若是,则A和B被C d-分隔,A和B之间没有边;否则,A,B之间存在边。
基于约束的算法来源于Pearl关于因果图模型的工作:IC(inductive causation)算法。
这个算法的基本步骤是这样的:
(1)对成对的节点A和B寻找节点集合V的子集S:满足给定S是A,B独立且A,B不在S中。
如果找不到这样的S,那么在AB之间加一条无向边。
这一步可以看做是在一张完全图上利用条件独立的假设检验进行修剪的后向过程。
(2)对有共同邻居C的不相邻节点A和B,如果C也不在(1)的节点子集S中,那么把A-C和C-B由无向边改为有向边AB,CB(就是寻找v-结构)
(3)迭代下面两步,对无向边设置方向:(a)如果A和B相连接,且有一个从A到B的有向路径,就把A-B改为A→B (b)如果A和B没连接,但A→C且C-B,则C-B改为C←B
当然,这个算法对于节点较多的真实问题,计算复杂度是很高的。
所以应用的是一些基于IC 算法发展的算法,在bnlearn包里使用的是这样一些算法(括号内是函数名):
Grow-Shrink (gs)
Incremental Association (iamb)
Fast Incremental Association (fast.iamb)
Interleaved Incremental Association (inter.iamb)
Max-Min Parents and Children (mmpc) 这些算法的细节不在赘述,需要指出的是,在bnlearn包中这些算法可以利用snow包实现并行计算。
在算法中为检验条件独立性,使用了一些统计或信息论中的方法。
对离散数据,基于CPT (条件概率表),可以计算:
mutual information(mi)
Pearson's X2(x2)
Akaike Information Criterion(aict)
对连续数据,则是基于偏相关系:
linear correlation(cor/mc-cor)
Fisher's Z(zf/mc-zf)
mutual information (mi-g)
marks.bn <- gs(marks, undirected = FALSE)
marks.bn
##
## Bayesian network learned via Constraint-based methods
##
## model:
## [undirected graph]
## nodes: 5
## arcs: 6
## undirected arcs: 6
## directed arcs: 0
## average markov blanket size: 2.40
## average neighbourhood size: 2.40
## average branching factor: 0.00
##
## learning algorithm: Grow-Shrink
## conditional independence test: Pearson's Linear Correlation
## alpha threshold: 0.05
## tests used in the learning procedure: 32
## optimized: TRUE
marks.bn <- gs(marks, debug = TRUE) #debug=TRUE可以看到调试的过程(结果略)
graphviz.plot(marks.bn, layout = "fdp")
利用gs()得到的网络是个无向图(利用其它的基于约束的算法会得到类似的结果)。
那么使用白名单(whitelist)和黑名单(blacklist)可以对gs()得到的网络进行修正。
黑名单是不该出现在图中的弧的集合而白名单则相反。
比如,稍作修正:
blacklisting <- data.frame(c("STAT", "STAT", "ALG"), c("ANL", "ALG", "MECH")) marks.bn2 <- gs(marks, blacklist = blacklisting)
highlight.opts <- list(nodes = c("STAT", "ANL"), arcs = c("ANL", "STAT"), col = "blue",
fill = "grey", lwd = 2.5)
graphviz.plot(marks.bn2, layout = "fdp", highlight = highlight.opts)
3.2.2基于评分的算法
运用优化中的贪婪算法,对每个“备选”的网络指定一个表示拟合优度的得分,然后取评分最大的网络。
bnlearn包里边使用评分法的函数只有一个:hc(),使用的是爬山法(Hill-Climbing)。
这个方法的基本思路是:
(1)选择一个网络结构G(通常是空的)
(2)计算G的得分,定义score=score(G)
(3)取maxscore=score(G)
(4)随着maxscore的增加,重复下面的步骤:(i)对边的增加,删减或颠倒操作不会导致一个有环的网络。
(ii)计算修正的网络,更新maxscore
(5)最后返回一个有向图
常用的评分方法有:
likelihood (lik)/log-likelihood (loglik) Akaike (aic) 和Bayesian (bic) Information Criterion
Bayesian Dirichlet equivalent score (bde)
K2 score (k2), 另一种Dirichlet 后验密度
下面看hc( )的学习效果:
marks.bn1 <- hc(marks)
marks.bn1
##
## Bayesian network learned via Score-based methods
##
## model:
## [MECH][VECT|MECH][ALG|MECH:VECT][ANL|ALG][STAT|ALG:ANL] ## nodes: 5
## arcs: 6
## undirected arcs: 0
## directed arcs: 6
## average markov blanket size: 2.40
## average neighbourhood size: 2.40
## average branching factor: 1.20
##
## learning algorithm: Hill-Climbing
## score:
## Bayesian Information Criterion (Gaussian)
## penalization coefficient: 2.239
## tests used in the learning procedure: 34
## optimized: TRUE
graphviz.plot(marks.bn1, layout = "fdp")
score(marks.bn1, data = marks, type = "bic-g") #得分BIC
## [1] -1720
3.2.3混合算法bnlearn包中的混合算法包括Max-Min Hill Climbing(mmhc)以及2-phase Restricted Maximization(rsmax2)
贝叶斯网的R实现(Bayesian networks in R)(二)bnlearn(3)
2013-06-26 21:46:53
4.参数学习
得到贝叶斯网的网络结构之后,可以对局部分布的参数进行参数估计了,这称作参数学习。
4.1参数学习的基本方法
bnlearn包的参数学习函数是bn.fit,其参数method给出了两种具体的方法:“mle”为极大似然估计;"bayes"为贝叶斯后验估计(采用无信息先验分布)。
4.2对marks数据集的参数学习
marks是个连续数据集,所以参数采用的是回归系数的形式。
下面对其中的一个节点计算参数的极大似然估计:
library(bnlearn)
## Warning: package 'bnlearn' was built under R version 3.0.1
data(marks)
marks.bn <- gs(marks, undirected = FALSE)
marks.bn1 <- hc(marks)
marks.fit <- bn.fit(marks.bn1, data = marks)
marks.fit <- bn.fit(marks.bn, data = marks)
## Error: the graph is only partially directed.
marks.fit$ALG
##
## Parameters of node ALG (Gaussian distribution)
##
## Conditional density: ALG | MECH + VECT
## Coefficients:
## (Intercept) MECH VECT
## 25.3620 0.1834 0.3577
## Standard deviation of the residuals: 7.987
## Pearson's Linear Correlation
##
## data: ALG ~ STAT | ANL
## cor = 0.4172, df = 85, p-value = 5.827e-05
## alternative hypothesis: true value is not equal to 0
#在参数估计的时候,由gs算法得到的mark.bn是个部分有向图,会报错。
参数估计bn.fit的结果得到一个bn.fit对象。
利用这个可以修改局部分布。
marks.fit$ALG <- list(coef = c(`(Intercept)` = 26, MECH = 0.18, VECT = 0.36),
sd = 7.99)
marks.fit$ALG
##
## Parameters of node ALG (Gaussian distribution)
##
## Conditional density: ALG | MECH + VECT
## Coefficients:
## (Intercept) MECH VECT
## 26.00 0.18 0.36
## Standard deviation of the residuals: 7.99
在marks这个连续数据例子中,生成的网络是高斯贝叶斯网,在上面对参数的修改中,包括了一个回归系数的完整集合(就是coef),以及残差的标准差(sd)
另外,利用custom.fit函数也可以使用上面的语法生成bn.fit对象。
5.离散化
下面考虑在保持相依结构的前提下把marks数据集进行离散化。
这种离散化会如何改变网络的形式呢?discretize可以实现离散化的功能。
下面是discretize采用interval方法,按照中位数分为两个区间(breaks=2),数据按相应的区间归到对应的类中。
离散化的数据也可以采用结构学习的方法,由结构学习算法得到相应的网络结构。
marks.d <- discretize(marks, method = "interval", breaks = 2)
marks.dgs <- gs(marks.d)
plot(marks.dgs, radius = 200, arrow = 30)
plot(marks.dhc, radius = 160, arrow = 40)
all.equal(cpdag(marks.dgs), cpdag(marks.dhc))
## [1] TRUE
可以看到离散化之后的网络结构依然保持着连续数据marks生成的部分网络结构。
离散化的网络参数就构成了CPT(条件概率表)。
下面是参数学习的结果:marks.fit2 <- bn.fit(marks.dhc, data = marks.d)
marks.fit2$ALG
##
## Parameters of node ALG (multinomial distribution)
##
## Conditional probability table:
##
## VECT
## ALG [8.93,45.5] (45.5,82.1]
## [14.9,47.5] 0.5806 0.2281
## (47.5,80.1] 0.4194 0.7719
贝叶斯网的R实现(Bayesian networks in R)(二)bnlearn(4)
2013-11-02 22:03:44
贝叶斯网络的推理(inference)
(1)推理问题在了解如何构造贝叶斯网络之后,下面我们考虑如何利用贝叶斯网络来进行推理。
贝叶斯网络的推理是对某些变量当给定其它变量的状态作为证据时如何推断它们的状态,也就是通过计算回答查询(query)的过程。
这个推理的过程也称为概率推理或信念更新。
在实践中,贝叶斯网的推理基于贝叶斯统计,重点在于后验概率或密度的计算。
推理问题可分为这样的三类:(a)后验概率分布问题这类问题是已知某些变量的取值,计算另一些变量的后验概率分布。
已知的变量可称为证据变量(evidence variables),记作E,取值记
为e。
需要计算后验概率分布的变量叫查询变量,记为Q。
按证据变量和因果变量的不同逻辑关系,这种概率推理又可分成:从结果到原因的推理、从原因到结果的推理、同一结果的不同原因的关联推理以及包含以上三种的混合推理。
(b)最大后验假设问题(MAP)(c)最大可能解释问题(MPE)
(2)推理问题的算法及实例
贝叶斯网络的概率推理的算法可分成两种:精确推理(exact inference)和近似推理(approximate inference)。
这两种推理都建立在前面所介绍的贝叶斯网的基本性质的基础上,目的是通过使用局部(边缘概率分布)的计算来避免计算(联合概率分布)的复杂程度。
精确推断组合了使用局部计算的贝叶斯定理的重复应用来得到条件概率或条件概率密度的
精确值。
然而,这种方法的可行性是有限的,局限于小的或者非常简单的网络上。
两种最著名的精确推断算法是变量消元法和团树传播法(又称联合树算法)。
这两种方法最早都起源于离散的网络,然后又扩展应用到连续网络和混合网络。
变量消元算法直接利用贝叶斯网的结构,指定了局部分布上的最优的序列运算以及如何存贮中间结果以避免不确定的计算。
团树传播算法是把贝叶斯网变换成一个联合树(junction tree)来执行。
联合树是moral 图的变换,是一个无向树,树中的每一个节点称为团(clique),由原贝叶斯网络中的一组随机变量构成,是无向图中最大的全连通子图。
下面是团树传播算法的步骤:
创建moral图:将原贝叶斯网络中同一节点的父节点两两相连,同时去掉每一条连接边的箭头,得到moral图。
三角化(Triangulating):对包含4个及以上个节点数的环,增加一条无向边将环中两个非相邻节点连接起来,完成对moral 图的三角化。
识别团(clique)节点:在三角化图中,识别团,每个团都是无向图的子图。
- 联合树:建立包含所有团的联合树,交集作为连接两个团的分隔节点。
重参数化:是用原贝叶斯网的局部分布的参数去计算联合树中复合节点的参数集合。
在R中,gRain包compile函数对离散的贝叶斯网运用了上面所述的团树传播算法。
asia网络(又称为chest clinic)是早期贝叶斯网文献中的给出的一个网络。
我们以这个网络为例,说明贝叶斯网查询函数的用法。
这是一个离散的网络。
首先使用bnlearn包的
model2work函数建立这个网络:呼吸困难(dyspnoea)可能由于肺结核(tuberculosis),肺癌(lung cancer)或者支气管炎(brochitis)的某一种(或几种),也可能有其它来源。
最近到亚洲旅行会增加肺结核感染的风险,同时吸烟也是一个众所周知的产生肺癌和支气管炎的风险因素。
一次胸腔X光不能在肺癌和肺结核之间做出判断,这三种疾病都不能由有没有呼吸困难来确诊。
library(bnlearn)
library(gRain)
# 利用条件概率表生成网络
asianet <-
model2network("[asia][smoke][tub|asia][lung|smoke][bronc|smoke][either|tub:lung][xray|ei ther][dysp|bronc:either]")
yn <- c("yes", "no")
cptA <- matrix(c(0.01, 0.99), ncol = 2, dimnames = list(NULL, yn))
cptS <- matrix(c(0.5, 0.5), ncol = 2, dimnames = list(NULL, yn))
cptT <- matrix(c(0.05, 0.95, 0.01, 0.99), ncol = 2, dimnames = list(tub = yn,
asia = yn))
cptL <- matrix(c(0.1, 0.9, 0.01, 0.99), ncol = 2, dimnames = list(lung = yn,
smoke = yn))
cptB <- matrix(c(0.6, 0.4, 0.3, 0.7), ncol = 2, dimnames = list(bronc = yn,
smoke = yn))
cptE <- c(1, 0, 1, 0, 1, 0, 0, 1)
dim(cptE) <- c(2, 2, 2)
dimnames(cptE) <- list(either = yn, lung = yn, tub = yn)
cptX <- matrix(c(0.98, 0.02, 0.05, 0.95), ncol = 2, dimnames = list(xray = yn,
either = yn))
cptD <- c(0.9, 0.1, 0.7, 0.3, 0.8, 0.2, 0.1, 0.9)
dim(cptD) <- c(2, 2, 2)
dimnames(cptD) <- list(dysp = yn, either = yn, bronc = yn)
asianet.fit <- custom.fit(asianet, dist = list(asia = cptA, smoke = cptS, tub = cptT,
lung = cptL, bronc = cptB, either = cptE, xray = cptX, dysp = cptD))
plot(asianet)
# moral图
asianet.m <- moral(asianet)
plot(asianet.m)
# 精确查询
asia.jtree <- compile(as.grain(asianet.fit))
summary(asia.jtree)
## Independence network: Compiled: TRUE Propagated: FALSE
## Nodes : Named chr [1:8] "asia" "bronc" "dysp" "either" "lung" ...
## - attr(*, "names")= chr [1:8] "asia" "bronc" "dysp" "either" ...
## Number of cliques: 6
## Maximal clique size: 3
## Maximal state space in cliques: 8
asia.ev1 <- setFinding(asia.jtree, nodes = c("asia", "dysp"), states = c("yes", "yes")) #设定证据
querygrain(asia.ev1, nodes = "lung", type = "marginal") #在证据之下查询
## $lung
## lung
## yes no
## 0.1135 0.8865
querygrain(asia.jtree, nodes = "lung", type = "marginal") #无证据下的查询
## $lung
## lung
## yes no
## 0.055 0.945
compile函数可以编译一个贝叶斯网,创建团树并建立潜在的团,其参数(要编译的网络)要求是grain对象,使用as.grain对bnlearn对象asianet.fit进行变换。
setFinding函数是用来设定查询条件,在这里我们设定证据为节点"asia",“dysp"各自取状态“yes”。
querygrain 函数是在给定证据的条件下,对网络进行查询,得到查询变量(这里是“lung”)的边缘分布(设定type参数,也可以得到条件分布或联合分布)。
下面在看近似推理。
最常用的近似推理算法是基于随机抽样的算法,也就是蒙特卡罗方法。
该算法不利用条件独立性,也不考虑概率分布的特征,而是通过抽样得到一组满足一定概率
分布的样本,然后用这些样本进行统计计算。
目前主要有两类随机抽样算法:重要性抽样法和马尔可夫链蒙特卡罗方法。
最早也是最简单的一种重要性抽样法是Henrion提出的概率逻辑抽样法。
它对没有证据变量的网络进行推理时非常有效,当网络中加入证据变量时,尤其是当证据变量的先验概率极小时,这种推理算法收敛将会非常慢, 因此Fung等提出了似然加权
法加以改进。
bnlearn包的cpdist函数和cpquery函数使用了近似推断算法。
其中cpquery返回一个数值,以证据evidence为条件下事件event的条件概率;cpdist返回一个数据框,包含生成于以证据evidence为条件的节点nodes的条件分布的观测。
# 近似查询,接上面的程序给定证据,查询事件发生的概率
set.seed(1000)
cpquery(asianet.fit, event = (lung == "yes"), evidence = (asia == "yes") & (dysp ==
"yes"))
## [1] 0.133
lung.sample <- cpdist(asianet.fit, nodes = "lung", evidence = (asia == "yes") &
(dysp == "yes"))
prop.table(table(lung.sample))
## lung.sample
## yes no
## 0.119 0.881
在这里,我们使用cpquery函数对网络asianet.fit对事件“lung”取值"yes"进行查询,设定证据为节点"asia”,“dysp"各自取状态“yes”;使用cpdist对网络进行查询,在给定上述证据的条件下,得到节点"lung"的条件概率分布表。