Python中scipy/numpy中的exp溢出?

23 python numpy scipy

以下错误是什么:

Warning: overflow encountered in exp
Run Code Online (Sandbox Code Playgroud)

在使用Python的scipy/numpy中通常意味着什么?我正在计算日志形式的比率,即log(a)+ log(b),然后使用exp,并使用与textsumexp的和,得到结果的指数,如下所示:

c = log(a) + log(b)
c = c - logsumexp(c)
Run Code Online (Sandbox Code Playgroud)

数组b中的某些值有意设置为0.它们的日志将为-Inf.

这警告的原因是什么?谢谢.

Joe*_*ton 27

根据你的情况,这意味着b非常小的地方你的阵列里,而且你得到一个数字(a/bexp(log(a) - log(b)))过大对任何D型(FLOAT32,float64等),你正在使用存储输出数组.

Numpy可以配置为

  1. 忽略这些错误,
  2. 打印错误,但不会发出警告以停止执行(默认值)
  3. 记录错误,
  4. 提出警告
  5. 提出错误
  6. 调用用户定义的函数

请参阅numpy.seterr控制它如何处理浮点数组中的欠/溢等等.


Dav*_*eau 8

当你需要处理指数时,你会快速进入欠流/过流,因为函数增长得如此之快.一个典型的例子是统计,其中各种幅度的求和是很常见的.由于数字非常大/小,人们通常会将日志保持在"合理"范围内,即所谓的日志域:

exp(-a) + exp(-b) -> log(exp(-a) + exp(-b))
Run Code Online (Sandbox Code Playgroud)

问题仍然存在,因为exp(-a)仍然会下溢.例如,exp(-1000)已经低于您可以表示为double的最小数字.例如:

log(exp(-1000) + exp(-1000))
Run Code Online (Sandbox Code Playgroud)

给出-inf(log(0 + 0)),即使你可以手工预测-1000(-1000 + log(2)).函数logsumexp通过提取数字集的最大值并将其从日志中取出来做得更好:

log(exp(a) + exp(b)) = m + log(exp(a-m) + exp(b-m))
Run Code Online (Sandbox Code Playgroud)

它不能完全避免下溢(例如,如果a和b大不相同),但它避免了最终结果中的大多数精度问题