【问题标题】:What is rtol for in numpy's allclose function?numpy 的 allclose 函数中的 rtol 是什么?
【发布时间】:2021-01-26 21:56:44
【问题描述】:

numpy.allclose() 中,有两个容差因素用于确定两个数组是否足够接近以计为相同。有相对公差rtol 和绝对公差atol。来自the docs

numpy.allclose(a, b, rtol=1e-05, atol=1e-08)

也来自文档:

如果以下等式按元素为 True,则 allclose 返回 True。
绝对(a - b)

数学上我理解这一点,但我对rtol 的观点感到困惑。为什么不只使用单个公差值tol,如果|a-b| < tol,则返回False?显然,按照上面的等式,我可以通过将rtol 设置为零来手动执行此操作,从而使所有内容都对称。打破对称性的rtol 因素有什么意义?

相关问题
How allclose() works?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    令人困惑的部分是方程显示了同时使用的两个参数。改为这样看:

    • 用例 1:绝对容差 (atol)absolute(a - b) <= atol
    • 用例 2:相对容差 (rtol)absolute(a - b) <= rtol * absolute(b)

    使用单个公差参数实现这两种方法的另一种方法是添加一个标志,用于确定公差是相对的还是绝对的。在数组值可以既大又为零的用例中,像这样分离用例会被打破。如果只有一个数组可以有零,则将其设为a,并在不使用atol 的情况下使用不对称方程对您有利。如果其中任何一个都可以为零,只需将rtol 设置为大元素可接受的值,然后将atol 设置为您想要用于零的值。

    您通常希望使用rtol:由于数字和计算的精度非常有限,因此较大的数字几乎总是不如较小的数字精确,并且差异呈线性比例(同样,通常)。唯一一次使用 atol 是用于非常接近于零的数字,以至于舍入误差可能大于数字本身。

    另一种查看方式是atol 比较固定小数位,而rtol 比较有效数字。

    【讨论】:

    • 并补充这个出色的答案:这两个用例都是完全合法的:要么你想说“如果两个值相差最多 0.1,我认为它们很接近”,或者你可能想说“如果两个值相差最多 0.1%,我认为它们接近”。
    • @Lagerbaer。确切地。很明显,两者都需要实施。它的完成方式有点令人困惑。
    • 案例 2 我会理解想要按数据的数量级进行缩放。但是在那种情况下,你为什么要优先考虑 b 而不是右手边的 a ,而不是 a 和 b 的平均值(或其他)?这只是惯例,您只需选择一个,在这种情况下它恰好是 b,它可能是硬币翻转? [编辑:我想让我烦恼的是不对称。 :) ]
    • @eric。因为你想知道元素是否靠近。如果它们足够远以至于在ab0.5 * (a + b) 之间存在差异,那么答案仍然是 False。
    • @eric。我已经更新了我的答案,以讨论您想在哪里使用两者。一般的想法是您通常希望使用rtol。但你不能为零。
    【解决方案2】:

    使用哪种容差取决于您的问题陈述。例如,如果我的数组具有广泛的值域,范围从 1e-10 到 1e10,该怎么办?小的atol 适合小值,但不适用于大值,反之亦然大atol。但是rtol 在这种情况下是完美的,因为我可以指定可接受的增量应随每个值缩放。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-27
      • 2022-08-19
      • 2014-10-06
      • 2019-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多