2016-11-01 4 views
2

Ich baue ein Bayes'sches Netzwerk mit den bnlearn Paketen in R. Nachdem ich den Baum erstellt habe, versuche ich einige Wahrscheinlichkeiten abzufragen und gebe den folgenden Fehler zurück ... Error in check.fit.dnode.spec(dist[[node]], node = node) : some conditional probability distributions of node Sprinkler do not sum to one.. Wenn ich gehe und überprüfe die Sprinkler es zu einem hinzufügen. Hier ist das Ergebnis Sprinkler ...R einige bedingte Wahrscheinlichkeitsverteilungen von Knoten summieren sich nicht zu

   Rain 
Slippery_Road true false 
     true 0.7 0.3 
     false 0.0 1.0 

Hier ist meine gesamte Code ...

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')) 

Antwort

2

Paar Punkte:

  1. Wet Grass CPT falsch ist (0,02 sollte 0.2, ein Tippfehler)?
  2. Scheint jeder CPT sollte Spalte stochastischen, nicht Zeile stochastischen sein.

Die folgenden Werke:

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 

Das Folgende ist Ihr Bayes-Netzwerk (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 
+1

Das gezogene Netzwerk direkt von der Adjazenzmatrix ist dass du definiert hast, wenn es nicht wie erwartet ist, dann pro Wahrscheinlich müssen wir die Graph-Adjazenz-Matrix noch einmal überprüfen (als gerichteter Graph). –

+0

Ich hatte meine Werte falsch. Dein Code hat geholfen! – Gilbert