online 0.4.0.0 → 0.5.0
raw patch · 3 files changed
+71/−3 lines, 3 filesdep +backprop
Dependencies added: backprop
Files
- online.cabal +5/−3
- src/Online.hs +2/−0
- src/Online/AveragesB.hs +64/−0
online.cabal view
@@ -1,6 +1,6 @@-cabal-version: 2.0+cabal-version: 3.0 name: online-version: 0.4.0.0+version: 0.5.0 synopsis: online statistics description: transformation of statistics to online algorithms category: statistics@@ -9,7 +9,7 @@ author: Tony Day maintainer: tonyday567@gmail.com copyright: Tony Day-license: BSD3+license: BSD-3-Clause license-file: LICENSE build-type: Simple @@ -21,6 +21,7 @@ exposed-modules: Online Online.Averages+ Online.AveragesB Online.Medians Online.Quantiles hs-source-dirs:@@ -32,6 +33,7 @@ , tdigest , vector , vector-algorithms+ , backprop default-language: Haskell2010 test-suite test
src/Online.hs view
@@ -1,10 +1,12 @@ -- | online library module Online ( module Online.Averages+ , module Online.AveragesB , module Online.Medians , module Online.Quantiles ) where import Online.Quantiles import Online.Averages+import Online.AveragesB import Online.Medians
+ src/Online/AveragesB.hs view
@@ -0,0 +1,64 @@+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-incomplete-patterns #-}++-- | online statistics based on a moving average+module Online.AveragesB+ ( foldB,+ foldB',+ maB,+ absmaB,+ sqmaB,+ stdB,+ std'+ ) where++import Prelude+import Numeric.Backprop as B+import qualified Prelude.Backprop as PB+import Control.Foldl (Fold(..))++foldB' :: (Backprop a, Backprop b, Reifies s W, Fractional b) => (BVar s a -> BVar s b) -> BVar s b -> BVar s [a] -> BVar s b+foldB' f r xs = divide (PB.foldl' (step' f r) (T2 0 0) xs) where+ step' f' r' (T2 s c) a = uncurry T2 ((r'*) $ s + f' a, (r'*) $ c + 1) + divide (T2 s c) = s / c+++online :: (Reifies s W, Fractional b) => (BVar s a -> BVar s b) -> (BVar s b -> BVar s b) -> Fold (BVar s a) (BVar s b)+online f g = Fold step begin extract+ where+ begin = (0, 0)+ step (s, c) a = (g $ s + f a, g $ c + 1)+ extract (s, c) = s / c++ma' :: (Reifies s W, Fractional b) => BVar s b -> Fold (BVar s b) (BVar s b)+ma' r = online id (*r)++sqma' :: (Reifies s W, Fractional b) => BVar s b -> Fold (BVar s b) (BVar s b)+sqma' r = online (\x -> x * x) (*r)++std' :: (Reifies s W, Floating b) => BVar s b -> Fold (BVar s b) (BVar s b)+std' r = (\s ss -> sqrt (ss - s ** 2)) <$> ma' r <*> sqma' r++-- coerceVar++foldB :: (Reifies s W) => (BVar s Double -> BVar s Double) -> BVar s Double -> BVar s [Double] -> BVar s Double+foldB f r xs = divide (PB.foldl' (step' f r) (T2 0 0) xs) where+ step' f' r' (T2 s c) a = uncurry T2 ((r*) $ s + f' a, (r'*) $ c + 1) + divide (T2 s c) = s / c++stdB :: Reifies s W => BVar s Double -> BVar s [Double] -> BVar s Double+stdB r xs = (\ss s -> sqrt (ss - s ** 2)) (foldB id r xs) (foldB (\x -> x * x) r xs)++-- stdB' :: Reifies s W => BVar s Double -> BVar s [Double] -> BVar s Double+-- stdB' r xs = (\(T2 ss s) -> sqrt (ss - s ** 2)) (foldB' (\x -> (T2 x (x*x))) (T2 r r) xs)++maB :: Reifies s W => BVar s Double -> BVar s [Double] -> BVar s Double+maB r = foldB id r++absmaB :: Reifies s W => BVar s Double -> BVar s [Double] -> BVar s Double+absmaB r = foldB abs r++sqmaB :: Reifies s W => BVar s Double -> BVar s [Double] -> BVar s Double+sqmaB r = foldB (\x -> x * x) r+