I am trying to find a way to calculate a moving cumulative average without storing the count and total data that is received so far.
I came up with two algorithms but both need to store the count:
The problem with these methods is that the count gets bigger and bigger resulting in losing precision in the resulting average.
The first method uses the old count and next count which are obviously 1 apart. This got me thinking that perhaps there is a way to remove the count but unfortunately I haven't found it yet. It did get me a bit further though, resulting in the second method but still count is present.
Is it possible, or am I just searching for the impossible?
You can simply do:
double approxRollingAverage (double avg, double new_sample) {
avg -= avg / N;
avg += new_sample / N;
return avg;
}
Where N
is the number of samples where you want to average over.
Note that this approximation is equivalent to an exponential moving average.
See: Calculate rolling / moving average in C++