【问题标题】:ZeroDivisionError: float division by zero when computing standard deviationZeroDivisionError:计算标准偏差时浮点除以零
【发布时间】:2013-07-26 16:58:20
【问题描述】:

我在我的脚本中发现了一个问题,该问题是由于尝试使用 scipy 的 .tstd 函数进行标准差计算而发生的,

 sp.stats.tstd(IR)

我的IR 值是0.0979。有没有办法让它停止(我假设)将它舍入为零?我已经尝试过以前的 stackoverflow 帖子中的一个建议,该帖子建议将该号码称为np.float64,但这没有用。希望有人知道答案。

完整的错误打印输出:

    Traceback (most recent call last):
  File "Utt_test.py", line 995, in <module>
    X.write(Averaging())
  File "Utt_test.py", line 115, in Averaging
    IR_sdev=str(round(sp.stats.tstd(IR),4))
  File "/usr/lib64/python2.7/site-packages/scipy/stats/stats.py", line 848, in tstd
    return np.sqrt(tvar(a,limits,inclusive))
  File "/usr/lib64/python2.7/site-packages/scipy/stats/stats.py", line 755, in tvar
    return a.var()*(n/(n-1.))
ZeroDivisionError: float division by zero

【问题讨论】:

  • tstd 需要一个 numpy 数组的输入。很难计算单个数字的标准差。
  • 从错误消息中,a.var()*(n/(n-1.)) 的计算过程中出现了问题。比问题在于n=1.。与 numpy float 或 IR 无关...
  • 我明白了……嗯,那我得重写一些东西了。该程序通常运行多个数字。我正在尝试一个特殊情况。
  • 该错误信息不是很有帮助,但真正的问题是tstd 和tvar(由tstd 调用)至少需要两个值。

标签: python numpy floating-point scipy divide-by-zero


【解决方案1】:

tstd 方法计算样本方差的平方根。样本方差与总体方差相差因子n/(n-1),这是使样本方差成为总体方差的无偏估计量所必需的。这在 n=1 时会失效,这是可以理解的,因为只有一个数字让我们不知道总体方差可能是多少。

如果不希望进行这种调整(也许您的数组是总人口,而不是其中的样本),请改用numpy.std。对于大小为 1 的数组,它将按预期返回 0。如果与参数 ddof=1 一起使用,numpy.std 将等效于 stats.tstd。


阿西:SciPy's documentation 州

tstd 计算无偏样本标准差,即它使用校正因子 n / (n - 1)。

重复这个标准误差估计量是无偏的常见误解(实际上,校正因子消除了方差的偏差,而不是标准偏差)。 NumPy's std documentation 在讨论 ddof 参数的这一点上被证明是正确的

但是,如果指定了 ddof,则使用除数 N - ddof。在标准统计实践中,ddof=1 提供了无限总体方差的无偏估计。 ddof=0 为正态分布的变量提供方差的最大似然估计。此函数中计算的标准差是估计方差的平方根,因此即使 ddof=1,它本身也不是标准差的无偏估计。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    相关资源
    最近更新 更多