我有一个数字列表数组,例如:
[0] (0.01, 0.01, 0.02, 0.04, 0.03)
[1] (0.00, 0.02, 0.02, 0.03, 0.02)
[2] (0.01, 0.02, 0.02, 0.03, 0.02)
...
[n] (0.01, 0.00, 0.01, 0.05, 0.03)
我想跨所有数组元素有效地计算列表的每个索引处的均值和标准差。
为了做到这一点,我一直在遍历数组并对列表的给定索引处的值求和。最后,我将“平均值列表”中的每个值除以 n
(我正在处理一个总体,而不是总体中的样本)。
为了计算标准差,我再次循环,现在我已经计算了平均值。
我想避免遍历数组两次,一次是平均值,一次是标准差(在我得到平均值之后)。
有没有一种有效的方法来计算这两个值,只遍历一次数组?任何解释语言(例如 Perl 或 Python)或伪代码的代码都可以。
最佳答案
答案是使用Welford算法,在“naive methods”之后定义非常明确:
它比其他响应中建议的两遍或在线简单平方和收集器在数值上更稳定。只有当您有许多彼此接近的值时,稳定性才真正重要,因为它们会导致浮点文献中所谓的“catastrophic cancellation”。
您可能还想重温除以样本数 (N) 和方差计算中的 N-1 之间的差异(平方偏差)。除以 N-1 会导致对样本方差的无偏估计,而除以 N 平均会低估方差(因为它没有考虑样本均值和真实均值之间的方差)。
我写了两篇关于该主题的博客文章,其中包含更多详细信息,包括如何在线删除以前的值:
- Computing Sample Mean and Variance Online in One Pass
- Deleting Values in Welford’s Algorithm for Online Mean and Variance
你也可以看看我的Java实现; javadoc、源代码和单元测试都在线:
关于python - 如何有效地计算运行标准差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1174984/