计算累积平均值(平均值)
Posted
技术标签:
【中文标题】计算累积平均值(平均值)【英文标题】:Calculate cumulative average (mean) 【发布时间】:2012-06-19 22:33:19 【问题描述】:我想知道如何计算某些数字的累积平均值。我将举一个简单的例子来描述我在寻找什么。
我有以下号码
vec <- c(1, 2, 3, 4, 5)
如果我对这些数字进行平均,我将得到 3。
现在,如何计算这些数字的累积平均值。
【问题讨论】:
itl.nist.gov/div898/software/dataplot/refman2/auxillar/… 对不起,亲爱的,但我刚刚从那里了解到,在这种情况下,累积平均值与常规平均值相同。我说的对吗?? 不,你错了——再读一遍公式。 如果你是这个意思,Y2(1) = Y(1).......... Y2(2) = (Y(1) + Y(2))/2 ......... Y2(3) = (Y(1) + Y(2) + Y(3))/3 ........ 这将为我们提供常规平均值或平均值。 【参考方案1】:类似于列表的累积总和,我提出以下建议: 向量 x 的累积平均值 avg 将包含从第一个位置到位置 i 的平均值。
一种方法是通过将所有先前的值相加并除以它们的数量来计算每个位置的平均值。
通过将arithmetic mean 的定义重写为递归 公式。一个得到
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
【讨论】:
【参考方案2】:这是一个老问题,从那时起发生了很多变化。我只是想用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
【讨论】:
【参考方案3】:问题如何在 R 中创建累积平均值?
答:
此答案由 Jim Holtman jholtman@gmail.com 提供
他使用了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
【讨论】:
【参考方案4】:只需保持数字的运行总和,以及它们的运行计数。 平均值只是计数的总和。
【讨论】:
对不起,我想知道如何做累积平均而不是常规平均。 仔细阅读答案 - @Mike D 已经解释了如何进行累积平均。 这是否意味着在这种情况下累积平均值应该为 1 ?来自数字的运行总和 = 15 并且运行计数也是 15 ?? @MRBIG:运行平均值为 1/1、3/2、6/3、10/4、15/5 等,除非我完全误解了您所说的“累积平均值”是什么意思 @Mike D:是的,这就是累积平均值,也就是说,它只是您每次获得新数据点时更新的平均值。【参考方案5】:这个问题表明严重缺乏研究,但我还没有足够的声誉来否决这个问题。如果我正确理解了这个问题,那么需要的是累积移动平均线。
Wikipedia 非常清楚地描述了累积移动平均线。我不允许在此处发布图片,但请按照该链接获取一个简单的公式(先前平均值和新值的加权平均值)。
【讨论】:
投了反对票,因为不是每个人都知道如何将 Wikipedia 上的数学方程式转换为代码,而您的回答只不过是“让我为您搜索一下。”【参考方案6】:我做了一个简单的 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
【讨论】:
【参考方案7】: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
【讨论】:
以上是关于计算累积平均值(平均值)的主要内容,如果未能解决你的问题,请参考以下文章