以下公式允许您根据您的要求仅根据存储的平均值和计数来跟踪平均值。
currentScore = (currentScore * currentCount + newValue)/(currentCount + 1)
currentCount = currentCount + 1
这取决于您的平均值是您的总和除以计数的事实。所以你只需乘以平均数来得到总和,加上你的新值并除以(count + 1),然后增加count。
因此,假设您有数据{7,9,11,1,12}
,唯一保留的是平均值和数量。随着每个数字的增加,您将得到:
+--------+-------+----------------------+----------------------+
| Number | Count | Actual average | Calculated average |
+--------+-------+----------------------+----------------------+
| 7 | 1 | (7)/1 = 7 | (0 * 0 + 7)/1 = 7 |
| 9 | 2 | (7+9)/2 = 8 | (7 * 1 + 9)/2 = 8 |
| 11 | 3 | (7+9+11)/3 = 9 | (8 * 2 + 11)/3 = 9 |
| 1 | 4 | (7+9+11+1)/4 = 7 | (9 * 3 + 1)/4 = 7 |
| 12 | 5 | (7+9+11+1+12)/5 = 8 | (7 * 4 + 12)/5 = 8 |
+--------+-------+----------------------+----------------------+
这是对维护总和,特别是如果你可以推迟平均直到你总结出所有的数字好点。 – paxdiablo 2008-12-04 12:22:43
但我们不应该把它变成一个相互钦佩的社会:-) – paxdiablo 2008-12-04 12:23:15
没错;一般来说,你可以用权力总和来计算第n个时刻。例如,你可以计算std.dev。与正方形,总数和数量相加。但是,如果您需要流式标准。开发。不要这样做,这样做:http://www.cs.berkeley.edu/~mhoemmen/cs194-fall2007/Tutorials/variance.pdf – 2008-12-04 12:26:07