Anonymous avatar 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/
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.