与平均值的偏差总和为 0 的例外情况
机器算法验证
算术
2022-03-23 06:02:59
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
现在非常小......但它并不完全为零。
如果您想详细研究有限精度计算与代数有何不同,这是一个方便的资源。
如果您手动计算平均值并将值四舍五入到小数点后 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是可比较的。
其它你可能感兴趣的问题