Calculating mean and standard deviation with std.algorithm.reduce
Joseph Rushton Wakeling
joseph.wakeling at webdrake.net
Wed Feb 13 06:59:49 PST 2013
On 02/13/2013 03:48 PM, FG wrote:
> You can use reduce and put the division and subtraction into the reduce itself
> to prevent overflows. You also won't end up with jaw-dropping tuples, sorry. :)
>
> float[] a = [10_000.0f, 10_001.0f, 10_002.0f];
> auto n = a.length;
> auto avg = reduce!((a, b) => a + b / n)(0.0f, a);
> auto var = reduce!((a, b) => a + pow(b - avg, 2) / n)(0.0f, a);
> auto sd = sqrt(var);
> writeln(avg, "\t", sd);
>
> Output: 10001 0.816497
Nice :-)
The thing that's desirable about the example given in the docs is that it's a
one-pass approach to getting standard deviation (or rather, mean and standard
deviation together). Two reduce commands as you suggest is fine for small data,
but if you have something really large you'd rather compute it in one pass. You
might also have input that is not [easily] repeatable, so you _have_ to do it
online -- imagine that your input range is e.g. a file byLine (you'd prefer to
avoid parsing that twice), or input from a tape (OK, OK, old fashioned) or
perhaps data from an external source.
More information about the Digitalmars-d-learn
mailing list