LazyPPL

LazyPPL is a Haskell library for probabilistic programming. It supports lazy use of probability, and we provide new Metropolis-Hastings algorithms to allow this. LazyPPL is inspired by recent ideas in synthetic probability theory and synthetic measure theory such as quasi-Borel spaces and Markov categories. Laziness appears to be a good paradigm for non-parametric statistics. LazyPPL is inspired by many other languages, including Church, Anglican, and MonadBayes.

LazyPPL provides two monads:

Simple example

To illustrate the basic usage, here is a very simple first example, that doesn’t use laziness. More advanced examples are in the menu above and further examples in the Bitbucket repository.

Extensions and imports for this Literate Haskell file
> {-# LANGUAGE ExtendedDefaultRules #-}
> module Index where
> import LazyPPL
> import Distr
> import Graphics.Matplotlib hiding (density)
> import Data.List

Suppose we we know that there are fewer buses on Sundays than on other days. I notice 4 buses in an hour, what is the probability it is a Sunday?
> model :: Meas Bool
> model = do
>   -- Prior belief: it is Sunday with prob. 1/7
>   sunday <- sample $ bernoulli (1/7)
>   -- I know the rates of buses on the different days:
>   let rate = if sunday then 3 else 10 
>   -- observe 4 buses
>   score $ poissonPdf rate 4
>   return sunday
We run a Metropolis-Hastings simulation to get a stream of draws from this unnormalized measure. We plot a histogram of the results, which shows the posterior probability that it is Sunday, given that we saw 4 buses.
> inference :: IO ()
> inference = do
>   xws <- mh 1 model
>   plotHistogram "images/index-posterior.svg" (map fst $ take 1000 xws)
Code for plotting histograms.
> plotHistogram :: (Show a , Eq a) => String -> [a] -> IO ()
> plotHistogram filename xs = do
>   putStrLn $ "Generating " ++ filename ++ "..."
>   let categories = nub xs
>   let counts = map (\c -> length $ filter (==c) xs) categories
>   file filename $ bar (map show categories) $ map (\n -> (fromIntegral n)/(fromIntegral $ length xs)) counts
>   putStrLn $ "Done."
> 
> main = do {inference}


Generated by Pandoc from Literate Haskell. Full source at Bitbucket.