Quick actions

cmd+k|ctrl+k

Navigation

Languages

Welford Variance

Snippet info

Language

Haskell

Visibility

public

Author

homam

Created

2017-02-03T15:48:03Z

Updated

2017-02-11T14:00:29Z


-- Welford's variance
-- new_var = old_var * (x - old_mean) * (x - new_mean)


stats = scanl 
  (\ (count, sum, mean, var) x ->
    let k = 1 / (count + 1)
        mean' = mean + k * (x - mean)
        ssr' = (count - 1) * var + k * count * (x - mean) * (x - mean)
    in  (count + 1, sum + x, mean', ssr' / (max 1 count))
  )
  (0, 0, 0, 0)

main = mapM_ print . stats . read =<< getLine 
INFO