我想使用Welford的方法来计算运行方差和平均值.我在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的差异足够重要,可能会影响我的结果.
为什么会有这样的差异?这是否是由于复合浮点错误造成的?如果是这样,我最好的 Select 是重写包以使用Decimal
类吗?