HLearn-distributions-1.0.0: src/HLearn/Models/Distributions/Univariate/Binomial.hs
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module HLearn.Models.Distributions.Univariate.Binomial
where
import HLearn.Algebra
import HLearn.Models.Distributions.Common
import HLearn.Models.Distributions.Univariate.Internal.Moments
import HLearn.Models.Distributions.Visualization.Gnuplot
import qualified Statistics.Distribution as S
import Statistics.Distribution.Binomial
-------------------------------------------------------------------------------
-- data types
newtype Binomial sample prob = Binomial { bmoments :: (Moments3 sample) }
deriving (Read,Show,Eq,Ord,Monoid,Group)
-------------------------------------------------------------------------------
-- Training
instance (Num sample) => HomTrainer (Binomial sample prob) where
type Datapoint (Binomial sample prob) = sample
train1dp dp = Binomial $ train1dp dp
-------------------------------------------------------------------------------
-- distribution
instance (Num sample) => Probabilistic (Binomial sample prob) where
type Probability (Binomial sample prob) = prob
instance (Floating prob) => PDF (Binomial Int Double) where
pdf (Binomial dist) dp = S.probability (binomial n p) dp
where
n = bin_n $ Binomial dist
p = bin_p $ Binomial dist
bin_n :: Binomial Int Double -> Int
bin_n (Binomial dist) = round $ ((fromIntegral $ m1 dist :: Double) / (fromIntegral $ m0 dist)) / (bin_p $ Binomial dist)
bin_p :: Binomial Int Double -> Double
bin_p (Binomial dist) = ((fromIntegral $ m1 dist) / (fromIntegral $ m0 dist)) + 1 - (fromIntegral $ m2 dist)/(fromIntegral $ m1 dist)
instance
( PDF (Binomial sample prob)
-- , PlottableDataPoint sample
, Show prob
, Show sample
, Ord sample
, Ord prob
, Num prob
, Integral sample
) => PlottableDistribution (Binomial sample prob)
-- instance PlottableDistribution (Poisson Int Double)
where
plotType _ = Points
samplePoints dist = [min..max]
where
min = 0
max = maximum [20,floor $ 3*mu]
mu = 5
-- instance (Fractional prob) => Mean (Binomial prob) where
-- mean (Binomial dist) =
--
-- instance (Fractional prob) => Variance (Binomiral prob) where
-- variance dist = mean dist