Calculate cumulative average (mean)

2019-01-07 23:33发布

问题:

I would like to know how to calculate the cumulative average for some numbers. I will give a simple example to describe what I am looking for.

I have the following numbers

vec <- c(1, 2, 3, 4, 5)

If I do the average of these numbers I will get 3 as a result.

Now, how to do the cumulative average of these numbers.

回答1:

In analogy to the cumulative sum of a list I propose this: The cumulative average avg of a vector x would contain the averages from 1st position till position i.

One method is just to compute the the mean for each position by summing over all previous values and dividing by their number.

By rewriting the definition of the arithmetic mean as a recursive formula. One gets

avg(1) = x(1)

and

avg(i) = (i-1)/i*avg(i-1) + x(i)/i;    (i > 1)

Evaluating this expression for every element of your vector (or list, one-dimensional array or however you call it) gives you the cumulative average.

This recursive method comes in handy if you have to calculate an average over very large or very many integers and would run into an overflow if you had to store their cumulative sum.

Example

In your example

1, 2, 3, 4, 5

we get

1, 1.5, 2, 2.5, 3


回答2:

Just keep a running sum of the numbers, and a running count of them. The average is just the sum over the count.



回答3:

Question how to create a Cumulative Average in R? Ans: This answer was provided by Jim Holtman jholtman@gmail.com He uses the cumsum() function and the seq_along() function so read up on those. But the code provided make it clear. 6, 6 + 16, 6 + 16 + 8, and so on

   x <- sample(1:20)
    x
 # [1]  6 16  8  1 17 11  2 19 18  5 15 13  3 20  9 14  7 10 12  4

    cumsum(x) / seq_along(x)
 # [1]  6.000000 11.000000 10.000000  7.750000  9.600000  9.833333  8.714286
 #10.000000 10.888889 10.300000
 #[11] 10.727273 10.916667 10.307692 11.000000 10.866667 11.062500 10.823529
 #10.777778 10.842105 10.500000


回答4:

The question indicates serious lack of research but I don't have enough reputation yet to vote the question down. If I understand the question correctly, what is desired is the cumulative moving average.

Wikipedia describes cumulative moving average very clearly. I'm not allowed to post an image here but follow that link for a simple formula (a weighted average of the previous average and the new value).



回答5:

This is an old question and there have been lot of changes since then. I just thought of updating it with a dplyr answer. dplyr has a cummean function which directly gives the cumulative mean of the vector.

vec <- c(1, 2, 3, 4, 5)
library(dplyr)
cummean(vec)

#[1] 1.0 1.5 2.0 2.5 3.0


回答6:

mynum [1] 1 2 3 4 5

cumsum(mynum)/seq(from=1, to=5)

[1] 1.0 1.5 2.0 2.5 3.0



回答7:

I made a simple C++ class.

#include <iostream>

using namespace std;

class Average {

public:
    Average(const double initVal=0.0){accumVal=initVal;}
    double getAverage(const double newVal) {

        accumVal += newVal;
        return accumVal / ++numAccumVal;
    }
    void clear(const double clearedVal=0.0) {

        accumVal = clearedVal;
        numAccumVal = 0;
    }
private:
    double accumVal;
    unsigned int numAccumVal=0;
};

int main(int argc, const char * argv[]) {

    Average avg;

    for (size_t i=1; i<=5; ++i) { //feed in 1 to 5

        double result = avg.getAverage(i);
        cout << "Result : " << result << endl; //print the result
    }
    return 0;
}

And if you run the code, you will get the result as below.

Result : 1
Result : 1.5
Result : 2
Result : 2.5
Result : 3
Program ended with exit code: 0