hbayes-0.5: Bayesian Networks

Safe HaskellSafe-Infered




Test of learning

In this example, two networks are used : simple which is the reference and wrong which is a wrong start. The goal is to use test patterns to learn the right simple network from wrong. Only the values are learnt. The topology of both networks is the same.

simple :: ([TDV Bool],SBN CPT)
simple = runBN $ do 
    a <- variable "a" (t :: Bool)
    b <- variable "b" (t :: Bool) 
    proba a ~~ [0.4,0.6]
    cpt b [a] ~~ [0.8,0.2,0.2,0.8]
    return [a,b]

and wrong where the probability for a is wrong.

wrong :: ([TDV Bool],SBN CPT)
wrong = runBN $ do 
    a <- variable "a" (t :: Bool)
    b <- variable "b" (t :: Bool) 
    proba a ~~ [0.2,0.8]
    cpt b [a] ~~ [0.8,0.2,0.2,0.8]
    return [a,b]

So, the first thing to do is generate test patterns. We are using the discreteAncestralSampler for this. This function is generating a sequence of graphs. We are just interested in the values. So, we get the values with allVertexValues.

generatePatterns :: IO [[DVI]]
generatePatterns = do 
    let (vars@[a,b],exampleG) = simple
    r <- runSampling 5000 0 (discreteAncestralSampler exampleG)
    return (map allVertexValues r)

Once we have the data, we can try to learn the network:

emTest = do 
  samples <- generatePatterns 
  let (_,simpleG) = simple 
      (_,wrongG) = wrong 
  print simpleG 
  printGraphValues simpleG
  printGraphValues wrongG
  printGraphValues (learnEM samples wrongG)

First, we display the topology of the graph and the values for the reference graph and the wrong one. Then, we use the learnEM function to learn a new network from the samples. And, we print the new values to check.


Test function