R 节点的某些条件概率分布之和不等于 1

标签 r bayesian

我正在使用 R 中的 bnlearn 包构建贝叶斯网络。构建树后,我尝试查询一些概率并返回以下错误...... 错误在 check.fit.dnode.spec(dist[[node]], node = node) 中: Sprinkler 节点的某些条件概率分布之和不等于 1。。当我去检查洒水器时,它确实增加了一个。这是Sprinkler的结果...

             Rain
Slippery_Road true false
        true   0.7   0.3
        false  0.0   1.0

这是我的完整代码...

require(bnlearn)

vname <- c('Winter', 'Sprinkler', 'Rain', 'Wet_Grass', 'Slippery_Road')
e <- empty.graph(vname)
arc.set <- matrix(c('Winter', 'Winter', 'Sprinkler', 'Rain', 'Rain', 
                'Sprinkler', 'Rain', 'Wet_Grass', 'Wet_Grass', 'Slippery_Road'),
              ncol = 2, dimnames = list(NULL, c('from', 'to')))
arcs(e) <- arc.set

# Winter
cptW <- matrix(c(0.6, 0.4), ncol = 2, dimnames = list(NULL, c('true', 'false')))
cptW

# Sprinkler
cptS <- c(0.2, 0.75, 0.8, 0.25)
dim(cptS) <- c(2, 2)
dimnames(cptS) <- list('Sprinkler' = c('true', 'false'),
                   'Winter' = c('true', 'false'))
cptS

# Rain
cptR <- c(0.8, 0.1, 0.2, 0.9)
dim(cptR) <- c(2, 2)
dimnames(cptR) <- list('Rain' = c('true', 'false'),
                   'Winter' = c('true', 'false'))
cptR

# Wet Grass
cptG <- c(0.95, 0.9, 0.05, 0.1, 0.8, 0, 0.02, 1)
dim(cptG) <- c(2, 2, 2)
dimnames(cptG) <- list('Wet_Grass' = c('true', 'false'),
                   'Rain' = c('true', 'false'),
                   'Sprinkler' = c('true', 'false'))
cptG

# Slippery Road
cptSR <- c(0.7, 0, 0.3, 1)
dim(cptSR) <- c(2, 2)
dimnames(cptSR) <- list('Slippery_Road' = c('true', 'false'),
                   'Rain' = c('true', 'false'))
cptSR

dfit <- custom.fit(e, dist = list(Winter = cptW, Sprinkler = cptS,
                              Rain = cptR, Wet_Grass = cptG,
                              Slippery_Road = cptSR))

# Calculating probabilities
cpquery(dfit, event = (Slippery_Road == 'false'), evidence = (Winter == 'true'))

最佳答案

几点:

  1. Wet Grass CPT 错误(0.02 应该是 0.2,拼写错误)?
  2. 似乎每个 CPT 都应该是列随机的,而不是行随机的。

以下作品:

require(bnlearn)

vname <- c('Winter', 'Sprinkler', 'Rain', 'Wet_Grass', 'Slippery_Road')
e <- empty.graph(vname)
arc.set <- matrix(c('Winter', 'Winter', 'Sprinkler', 'Rain', 'Rain', 
                    'Sprinkler', 'Rain', 'Wet_Grass', 'Wet_Grass', 'Slippery_Road'),
                  ncol = 2, dimnames = list(NULL, c('from', 'to')))
arcs(e) <- arc.set

以下是您的贝叶斯网络 (DAG):

library(Rgraphviz)
plot(e)

enter image description here

# Winter
cptW <- matrix(c(0.6, 0.4), ncol = 2, dimnames = list(NULL, c('true', 'false')))
cptW

     true false
[1,]  0.6   0.4

# Sprinkler:  P(S|W) since the direction of the edge is W -> S
cptS <- c(0.2, 0.8, 0.75, 0.25)
dim(cptS) <- c(2, 2)
dimnames(cptS) <- list('Sprinkler' = c('true', 'false'),
                       'Winter' = c('true', 'false'))
cptS

          Winter
Sprinkler true false
    true   0.2  0.75
    false  0.8  0.25

# Rain: P(R|W)
cptR <- c(0.8, 0.2, 0.1, 0.9)
dim(cptR) <- c(2, 2)
dimnames(cptR) <- list('Rain' = c('true', 'false'),
                       'Winter' = c('true', 'false'))
cptR   

        Winter
Rain    true false
  true   0.8   0.1
  false  0.2   0.9

# Wet Grass P(WG|S,R)
cptG <- c(0.95, 0.05, 0.9, 0.1, 0.8, 0.2, 0, 1)
dim(cptG) <- c(2, 2, 2)
dimnames(cptG) <- list('Wet_Grass' = c('true', 'false'),
                       'Rain' = c('true', 'false'),
                       'Sprinkler' = c('true', 'false'))
cptG

, , Sprinkler = true

         Rain
Wet_Grass true false
    true  0.95   0.9
    false 0.05   0.1

, , Sprinkler = false

         Rain
Wet_Grass true false
    true   0.8     0
    false  0.2     1

# Slippery Road P(SR|R)
cptSR <- c(0.7, 0.3, 0, 1)
dim(cptSR) <- c(2, 2)
dimnames(cptSR) <- list('Slippery_Road' = c('true', 'false'),
                        'Rain' = c('true', 'false'))
cptSR

              Rain
Slippery_Road true false
        true   0.7     0
        false  0.3     1

dfit <- custom.fit(e, dist = list(Winter = cptW, Sprinkler = cptS,
                                  Rain = cptR, Wet_Grass = cptG,
                                  Slippery_Road = cptSR))

# Calculating probabilities
cpquery(dfit, event = (Slippery_Road == 'false'), evidence = (Winter == 'true'))
# [1] 0.4342105

关于R 节点的某些条件概率分布之和不等于 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40364458/

相关文章:

javascript - Highcharter Shiny 事件 - 将多个选定点返回到数据框

r - 如何使用 httr 为基于证书的身份验证指定证书、 key 和根证书?

artificial-intelligence - 如何过滤/排序/排名对象模型节点?

algorithm - 加权平均值和评级

r - 将方程添加到绘图上的回归线

r - tidyr::pivot_wider 中的 values_fill 参数不起作用

python-3.x - tensorflow 中的 'tf.contrib.rnn.DropoutWrapper' ' 到底是做什么的? (三个关键问题)

python - 将混合模型移植到 pymc3

r - 在 Stan 中是否不可能将矩阵/向量乘以标量值?

R SSH 隧道 MySQL