我想知道如何计算某些数字的累积平均值。我将举一个简单的例子来描述我正在寻找的东西。
我有以下号码
vec <- c(1, 2, 3, 4, 5)
如果我做这些数字的平均值,结果我会得到 3。
现在,如何做这些数字的累积平均值。
类比于列表的累积总和,我提出这个建议:向量 x 的累积平均平均值将包含从第 1 位到位置 i 的平均值。
一种方法是通过对所有先前的值求和并除以它们的数量来计算每个位置的平均值。
通过将算术平均值的定义重写为递归公式。一个得到
avg(1) = x(1)
和
avg(i) = (i-1)/i*avg(i-1) + x(i)/i; (i > 1)
为向量(或列表、一维数组或你如何称呼它)的每个元素计算此表达式,可以得到累积平均值。
如果您必须计算非常大或非常多整数的平均值,则此递归方法会派上用场,如果必须存储它们的累积总和,则会遇到溢出。
例
在您的示例中
1, 2, 3, 4, 5
我们得到
1, 1.5, 2, 2.5, 3
这是一个老问题,从那以后有很多变化。我只是想用dplyr
答案更新它。 dplyr
有一个cummean
函数,它直接给出向量的累积平均值。
vec <- c(1, 2, 3, 4, 5)
library(dplyr)
cummean(vec)
#[1] 1.0 1.5 2.0 2.5 3.0
cumsum()
函数和seq_along()
函数,因此请阅读它们。但是提供的代码很清楚。6、6 + 16、6 + 16 + 8,依此类推。
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
只需保留数字的运行总和,以及它们的运行计数。平均值只是计数的总和。
我做了一个简单的C++类。
#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;
}
如果你运行代码,你会得到如下结果。
Result : 1
Result : 1.5
Result : 2
Result : 2.5
Result : 3
Program ended with exit code: 0
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
这个问题表明严重缺乏研究,但我没有足够的声誉来投票否决这个问题。如果我正确理解了这个问题,所需要的是累积移动平均线。
维基百科非常清楚地描述了累积移动平均线。我不允许在这里发布图像,但点击该链接以获取一个简单的公式(先前平均值和新值的加权平均值)。