首页 > 解决方案 > 计算增量平均值/平均值是否有利于精度?

问题描述

“计算平均值的最佳数值方法是什么”问题中,建议计算滚动平均值,即

mean =  a[n]/n + (n-1)/n * mean

可能比计算总和然后除以元素总数在数值上更稳定。对此,一位评论者提出了质疑。我不知道哪一个是真的——其他人可以吗?滚动平均值的优点是,您可以保持平均值很小(即所有向量条目的大小大致相同)。直观地说,这应该保持误差很小。但评论者声称:

部分问题是 1/n 在最低有效位中引入了错误,因此 n/n != 1,至少当它作为三步操作(除-存储-乘)执行时。如果只执行一次除法,这将被最小化,但您将在 GB 的数据上执行此操作。

所以我有多个问题:

  1. 滚动平均值是否比求和然后除更精确?
    • 这是否取决于是否先计算 1/n 然后相乘的问题?
    • 如果是这样,计算机是否实现了一步除法?(我是这么想的,但我现在不确定)
  2. 如果是,它是否比 Kahan 求和然后除法更精确?
  3. 如果可以比较 - 哪个更快?在这两种情况下,我们都有额外的计算。
  4. 如果更精确,你能用它来精确求和吗?

标签: performanceprecisionnumerical-methods

解决方案


  1. 在许多情况下,是的。考虑一个所有正项的序列,所有项都在相同的数量级上。将它们全部相加会生成一个大的中间和,我们在其中添加一些小的项,这可能会精确地四舍五入到中间和。使用滚动总和,您可以获得相同数量级的项,此外,总和更难溢出。然而,这不是一成不变的:添加项然后除法允许我们使用 AVX 指令,这比滚动循环的减法/除法/加法指令要快得多。此外,有些分布会导致其中一个或另一个更准确。这已在以下方面进行了检查:

罗伯特·F·林。计算样本均值和方差的几种算法的比较。美国统计协会杂志, 69(348): 859–866, 1974

  1. Kahan求和是一个正交问题。您可以将 Kahan 求和应用于序列x[n] = (x[n-1]-mu)/n;这是非常准确的。

推荐阅读