numpy 的 allclose 函数中 rtol 的作用是什么?

eri*_*ric 18 python numpy

其中numpy.allclose()有两个容差因子用于确定两个阵列是否足够接近以算作相同。有相对宽容rtol和绝对宽容atol。来自文档

numpy.allclose(a, b, rtol=1e-05, atol=1e-08)
Run Code Online (Sandbox Code Playgroud)

还来自文档:

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

从数学上我理解这一点,但我对 的意义感到困惑rtol。为什么不只使用单个容差值tol|a-b| < tol然后返回Falsertol显然,按照上面的等式,我可以通过设置为零来手动完成此操作,从而使一切对称。对称破缺rtol因子有什么意义?

相关问题
allclose() 是如何工作的?

Mad*_*ist 19

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

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

使用单个公差参数实现两者的另一种方法是添加一个标志来确定公差是相对的还是绝对的。像这样分隔用例在数组值既可以很大也可以为零的用例中会失败。如果只有一个数组可以有零,则将其设为 1a并使用不对称方程来获得好处,而无需atol. 如果其中任何一个可以有零,只需将rtol大元素设置为一些可接受的值,然后设置atol为您想要为零添加的值。

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

另一种看待它的方法是atol比较固定小数位,同时rtol比较有效数字。

  • 为了补充这个优秀的答案:这两个用例都是完全合法的:要么你想说“如果两个值相差最多 0.1,我认为它们接近”,要么你可能想说“如果它们不同,我认为两个值接近”最多 0.1%”。 (2认同)

0x5*_*453 5

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