hbayes-0.5: Bayes/Examples/Sampling.hs
{- | Example of sampling
Two samplers are availables : the 'discreteAncestralSampler' and the 'gibbsSampler'.
Only the 'gibbsSampler' can be used with evidence.
In this example, we have a very simple network.
@
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]
@
This network is representing a sensor b. We observe the value of b and we want to infer the value of a.
We use the 'gibbsSampler' for this with an initial period of 200 samples which are dropped. The 'gibbsSampler' is
generate a stream of samples. From this stream, we need to compute a probability distribution. For this, we use
the 'samplingHistograms' histogram function which is generating a list : the probability values of each vertex.
@
let (vars\@[a,b],exampleG) = simple
n <- 'runSampling' 5000 200 ('gibbsSampler' exampleG [b '=:' True])
let h = 'samplingHistograms' n
print $ h
@
Then, we compare this result with the exact one we get with a junction tree.
@
let jt = 'createJunctionTree' 'nodeComparisonForTriangulation' exampleG
jt' = 'changeEvidence' [b '=:' True] jt
mapM_ (\x -> print . 'posterior' jt' $ [x]) vars
@
We can also use the 'discreteAncestralSampler' to compute the posterior but it is not supporting the use of evidence in this
version. The syntax is similar.
@
n <- 'runSampling' 500 ('discreteAncestralSampler' exampleG)
@
-}
module Bayes.Examples.Sampling(
-- * Test function
testSampling
) where
import Bayes.Sampling
import System.Random.MWC.CondensedTable
import qualified Data.Vector as V
import Bayes.Factor
import Bayes
import Bayes.FactorElimination
import Data.Maybe(fromJust)
import Bayes.BayesianNetwork
import Bayes.Factor.CPT
import Statistics.Sample.Histogram
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]
testSampling = do
let (vars@[a,b],exampleG) = simple
jt = createJunctionTree nodeComparisonForTriangulation exampleG
--n <- runSampling 500 (discreteAncestralSampler exampleG)
putStrLn "The bayesian network"
print exampleG
putStrLn "\nThe values of the Bayesian network"
printGraphValues exampleG
n <- runSampling 5000 200 (gibbsSampler exampleG [b =: True])
let h = samplingHistograms 2 n
putStrLn "\nThe result of the sampling"
print $ h
n <- runSampling 5000 200 (gibbsMCMCSampler exampleG [b =: True])
let h = samplingHistograms 2 n
putStrLn "\nThe result of the sampling with MCMC"
print $ h
let jt' = changeEvidence [b =: True] jt
putStrLn "\nThe result of the junction tree inference"
mapM_ (\x -> print . posterior jt' $ [x]) vars