R节点的一些条件概率分布不总和为1

时间:2016-11-01 16:36:29

标签: r bayesian

我正在使用R中的bnlearn软件包构建贝叶斯网络。构建树后,我试图查询一些概率并返回以下错误.... {{1 }}。当我去检查Error in check.fit.dnode.spec(dist[[node]], node = node) : some conditional probability distributions of node Sprinkler do not sum to one.它确实添加到一个。以下是Sprinkler ...

的结果
Sprinkler

这是我的整个代码......

             Rain
Slippery_Road true false
        true   0.7   0.3
        false  0.0   1.0

1 个答案:

答案 0 :(得分:2)

几点:

  1. 湿草CPT错误(0.02应该是0.2,错字)?
  2. 似乎每个CPT应该是列随机的,而不是行随机的。
  3. 以下作品:

    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