Commits

Anonymous committed b43be50

Entropy instance for HypergeometricDistribution

Comments (0)

Files changed (1)

Statistics/Distribution/Hypergeometric.hs

 import Data.Binary (Binary)
 import Data.Data (Data, Typeable)
 import GHC.Generics (Generic)
+import Numeric.MathFunctions.Constants (m_epsilon)
 import Numeric.SpecFunctions (choose)
 import qualified Statistics.Distribution as D
 
     maybeStdDev   = Just . D.stdDev
     maybeVariance = Just . D.variance
 
-
+instance D.Entropy HypergeometricDistribution where
+  entropy = directEntropy
+  
+instance D.MaybeEntropy HypergeometricDistribution where
+  maybeEntropy = Just . D.entropy
 
 variance :: HypergeometricDistribution -> Double
 variance (HD m l k) = (k' * ml) * (1 - ml) * (l' - k') / (l' - 1)
 mean (HD m l k) = fromIntegral k * fromIntegral m / fromIntegral l
 {-# INLINE mean #-}
 
+directEntropy :: HypergeometricDistribution -> Double
+directEntropy d@(HD m _ _) =
+    negate . sum $
+  takeWhile (< negate m_epsilon) $
+  dropWhile (not . (< negate m_epsilon)) $
+  [ let x = probability d n in x * log x | n <- [0..m]]
+
+
 hypergeometric :: Int               -- ^ /m/
                -> Int               -- ^ /l/
                -> Int               -- ^ /k/