与平均值的偏差总和为 0 的例外情况

机器算法验证 算术
2022-03-23 06:02:59

我在这里阅读

除了可能的舍入之外,平均值的偏差总和将为 0。

谁能解释一下这是什么意思?我知道与平均值的偏差总和为零,但是除了可能的舍入之外,这又如何呢?

2个回答

当计算平均值时,它不会被计算为无限精度。因此,计算出的围绕平均值的偏差总和可能与零略有不同。

例如,我们可以在 R 中看到这一点,如下所示:

 x <- rnorm(1000)  # generates 1000 standard normal random numbers, puts them in x
 d <- x - mean(x)  # compute the deviations from the mean and put them in d
 sum(d)            # add the deviations
[1] 2.026851e-14

现在非常小......但它并不完全为零。2×1014

如果您想详细研究有限精度计算与代数有何不同,是一个方便的资源。

如果您手动计算平均值并将值四舍五入到小数点后 3 位,您会看到相同的结果 - 通常,平均值的偏差总和与零略有不同。

我想在之前的答案中添加一些内容,我完全同意。

碰巧我正在用 Java 实现一个统计库,并使用 R 的计算值作为参考点。几天前,我研究了实现均值和方差的算法。我发现计算 R 中平均值的 C 代码(R 中的平均值调用用 C 编写的内部函数)使用一种简单的技术来补偿舍入造成的损失。在那里我找到了你搜索的内容。

我将展示一个简化的代码,因为原始 C 代码使用宏和不必要的复杂内容:

function mean(double[] x) {
  double s = 0.;
  double n = length(x);
  for (int i = 0; i < n; i++) s += x[i];
  s /= n;
  double t = 0;
  for (int i = 0; i < n; i++) t += x[i] - s;
  s += t / n;
  return s;
}

在前面的代码中,变量t包含平均值的偏差总和。如果从数学角度严格解释该语句,则它应该为 0。但是在计算时,应将相同的语句重新定义为“t包含具有有限精度的计算平均值的偏差总和”。

当处理具有小变化的大值时,补偿的想法非常直观。在这种情况下, s 可能会丢失精度(通过丢失浮点表示的最后一位)并且计算t提供了更好的机会不这样做,因为x[i]和计算的值s是可比较的。