我想使用韦尔福德方法来计算运行方差和均值。我在 Python 中发现了 Welford 方法的 this 实现。然而,当测试双重检查其结果是否与计算方差的标准 Numpy 实现相同的输出时,我确实发现输出存在差异。
运行以下代码(使用python模块unittest)显示两者给出不同的结果(即使经过多次测试):
random_sample = np.random.normal(0, 1, 100)
std = np.var(random_sample, dtype=np.longdouble)
mean = np.mean(random_sample, dtype=np.longdouble)
welford = Welford()
welford.add_all(random_sample)
self.assertAlmostEqual(mean, welford.mean)
self.assertAlmostEqual(var, welford.var_s)
>> AssertionError: 1.1782075496578717837 != 1.1901086360180526 within 7 places (0.011901086360180828804 difference)
有趣的是,只有方差的差异,而不是均值的差异。
就我的目的而言,0.012 的差异足以影响我的结果。
为什么会有这样的差异?这可能是由于复合浮点错误造成的吗?如果是这样,我最好的选择是重写包以使用
Decimal
类?