11.5. Computing Variance, Standard Deviation, and Other Statistical Functions
Problem
You want to compute one or more of the common statistics such as variance, standard deviation, skew, and kurtosis of a sequence of numbers.
Solution
You can use the accumulate
function from the
<numeric>
header to compute many meaningful
statistical functions beyond simply the sum by passing custom function objects. Example 11-9 shows how to compute several
important statistical functions, using accumulate
.
Example 11-9. Statistical functions
#include <numeric> #include <cmath> #include <algorithm> #include <functional> #include <vector> #include <iostream> using namespace std; template<int N, class T> T nthPower(T x) { T ret = x; for (int i=1; i < N; ++i) { ret *= x; } return ret; } template<class T, int N> struct SumDiffNthPower { SumDiffNthPower(T x) : mean_(x) { }; T operator()(T sum, T current) { return sum + nthPower<N>(current - mean_); } T mean_; }; template<class T, int N, class Iter_T> T nthMoment(Iter_T first, Iter_T last, T mean) { size_t cnt = distance(first, last); return accumulate(first, last, T(), SumDiffNthPower<T, N>(mean)) / cnt; } template<class T, class Iter_T> T computeVariance(Iter_T first, Iter_T last, T mean) { return nthMoment<T, 2>(first, last, mean); } template<class T, class Iter_T> T computeStdDev(Iter_T first, Iter_T last, T mean) { return sqrt(computeVariance(first, last, mean)); } template<class T, class Iter_T> T computeSkew(Iter_T begin, Iter_T end, T mean) ...
Get C++ Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.