measurable

A simple shallowly-embedded DSL for dealing with measures.
Log | Files | Refs | README | LICENSE

commit caf2c4a3db97c660c99cf29b088fe171a7c5b88a
parent 80164e3efa5ed478ac8c8f548722d5651cf6f8a1
Author: Jared Tobin <jared@jtobin.ca>
Date:   Sat, 19 Oct 2013 16:34:58 +1300

Update examples.  Kind of mind-blowing.

Diffstat:
Msrc/Measurable.hs | 20+++++++++++++-------
Mtests/Test.hs | 26+++++++++++++++++++++++++-
2 files changed, 38 insertions(+), 8 deletions(-)

diff --git a/src/Measurable.hs b/src/Measurable.hs @@ -71,7 +71,8 @@ push :: (a -> b) -> Measure a -> Measure b push f mu = Measure pushforward where pushforward g = measure mu $ g . f --- | The volume is obtained by integrating against a constant. +-- | The volume is obtained by integrating against a constant. This is '1' for +-- any probability measure. volume :: Measure a -> Double volume mu = measure mu (const 1) @@ -99,16 +100,21 @@ convolute mu nu = Measure $ \f -> measure nu $ \y -> measure mu $ \x -> f (x + y) +-- | Measure subtraction. (does this make sense?) +msubtract mu nu = Measure $ \f -> measure nu + $ \y -> measure mu + $ \x -> f (x - y) + +-- | Measure multiplication. (does this make sense?) +prod :: Num a => Measure a -> Measure a -> Measure a +prod mu nu = Measure $ \f -> measure nu + $ \y -> measure mu + $ \x -> f (x * y) + -- | The (sum) identity measure. identityMeasure :: Fractional a => Measure a identityMeasure = fromObservations [] --- | Lebesgue measure. -lebesgue :: Double -> Double -> Measure Double -lebesgue a b = fromDensity rectangle - where rectangle x | x >= a && x <= b = 1 - | otherwise = 0 - -- | Simple average. average :: Fractional a => [a] -> a average xs = fst $ foldl' diff --git a/tests/Test.hs b/tests/Test.hs @@ -13,10 +13,12 @@ import Control.Monad import Measurable import Statistics.Distribution hiding (mean, variance) import Statistics.Distribution.Normal +import Statistics.Distribution.ChiSquared import System.Random.MWC import System.Random.MWC.Distributions -standardNormal = density $ normalDistr 0 1 +standardNormal = density $ normalDistr 0 1 +genLocationNormal m = density $ normalDistr m 1 main = do expSamples <- withSystemRandom . asGenIO $ \g -> @@ -37,3 +39,25 @@ main = do putStrLn $ "let X ~ N(0, 1), Y ~ observed. mean of exp(cos X + sin Y): " ++ show (mean eta) + putStrLn "" + putStrLn "and now some 'woah, this actally seems to make sense' examples:" + putStrLn "" + + let iota = mu `msubtract` mu + + putStrLn $ "let X, Y be independent N(0, 1). mean of X - Y: " ++ + show (mean iota) + putStrLn $ "let X, Y be independent N(0, 1). variance of X - Y: " ++ + show (variance iota) + + -- + + let phi = fromDensity $ genLocationNormal 2 + xi = fromDensity $ genLocationNormal 3 + zeta = prod phi xi + + putStrLn $ "let X ~ N(2, 1), Y ~ N(3, 1). mean of XY (should be 6) " ++ + show (mean zeta) + putStrLn $ "let X ~ N(2, 1), Y ~ N(3, 1). variance of XY (should be 14) " ++ + show (variance zeta) +