Welford 方差与 Numpy 方差不同

问题描述 投票:0回答:1

我想使用韦尔福德方法来计算运行方差和均值。我在 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
类?

python numpy statistics numerical-methods
1个回答
0
投票

存在差异,因为 默认情况下,在

np.var
中,自由度数是数组中元素的数量。
wellford.var_s
样本方差,其中自由度数是数组中元素的数量减一。 要消除差异,请将
ddof=1
传递给
np.var

np.var(random_sample, dtype=np.longdouble, ddof=1)
© www.soinside.com 2019 - 2024. All rights reserved.