我想使用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类吗?

推荐答案

默认情况下,np.var计算所谓的"人口方差",其中自由度的数量等于数组中元素的数量.

wellford.var_ssample variance,其中自由度的数量是数组minus one中的元件的数量.

要消除差异,请通过ddof=1np.var:

import numpy as np
from welford import Welford
random_sample = np.random.normal(0, 1, 100)
var = np.var(random_sample, dtype=np.longdouble, ddof=1)
welford = Welford()
welford.add_all(random_sample)
np.testing.assert_allclose(var, welford.var_s)

或者,如果适合在应用程序中使用人口方差,请使用welford.var_p.

var = np.var(random_sample, dtype=np.longdouble)
np.testing.assert_allclose(var, welford.var_p)

有关两者之间差异的描述,请参阅development version of the np.var documentation.

Python相关问答推荐

如何使用Python中的clinicalTrials.gov API获取完整结果?

使用from_pandas将GeDataFrame转换为polars失败,ArrowType错误:未传递numpy. dype对象

在Python中为变量的缺失值创建虚拟值

如何处理嵌套的SON?

使用mySQL的SQlalchemy过滤重叠时间段

Django管理面板显示字段最大长度而不是字段名称

Matlab中是否有Python的f-字符串等效物

运行总计基于多列pandas的分组和总和

对于一个给定的数字,找出一个整数的最小和最大可能的和

大小为M的第N位_计数(或人口计数)的公式

Telethon加入私有频道

我对我应该做什么以及我如何做感到困惑'

如何从数据库上传数据到html?

如何在TensorFlow中分类多个类

在Python中控制列表中的数据步长

应用指定的规则构建数组

SpaCy:Regex模式在基于规则的匹配器中不起作用

如何写一个polars birame到DuckDB

为什么在Python中00是一个有效的整数?

Django抛出重复的键值违反唯一约束错误