mean dat = sum dat / (fromIntegral $ length dat)
stddev dat = sqrt . mean $ map ((**2) . (m -)) dat
where
m = mean dat
data is a keyword in Haskell, so I'm using dat instead.
This solution is not very memory efficient on long, lazily-computed lists. If you're dealing with one of those, you might want to write a recursive version instead.
defmodule SD do
import Enum, only: [map: 2, sum: 1]
import :math, only: [sqrt: 1, pow: 2]
def standard_deviation(data) do
m = mean(data)
data |> variance(m) |> mean |> sqrt
end
def mean(data) do
sum(data) / length(data)
end
def variance(data, mean) do
for n <- data, do: pow(n - mean, 2)
end
end
# usage
data = [1,2,3,4]
m = SD.mean(data) # => 2.5
sd = SD.standard_deviation(data) # => 1.118033988749895
let sum: f64 = data.iter().sum();
let m = sum / (data.len() as f64);
let sum_of_squares: f64 = data.iter().map(|item| (item - m) * (item - m)).sum();
let s = (sum_of_squares / (list.len() as f64)).sqrt();