【问题标题】:Overflow in exp in scipy/numpy in Python?Python中scipy/numpy中的exp溢出?
【发布时间】:2010-12-05 16:55:48
【问题描述】:

以下错误是什么意思:

Warning: overflow encountered in exp

在 scipy/numpy 中使用 Python 一般是什么意思?我正在计算对数形式的比率,即 log(a) + log(b),然后使用 exp 取结果的指数,并使用 logsumexp 的总和,如下所示:

c = log(a) + log(b)
c = c - logsumexp(c)

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

此警告的原因可能是什么?谢谢。

【问题讨论】:

  • 嗯,看看log(a)-log(b)的结果,就知道为什么会溢出了。
  • 你能告诉我们更多关于你想要做什么的信息吗?您是否尝试实施 logsumexp ?

标签: python numpy scipy


【解决方案1】:

在您的情况下,这意味着 b 在您的数组中的某个位置非常小,并且您得到的数字(a/bexp(log(a) - log(b)))对于任何情况都太大了dtype (float32, float64, etc) 你用来存储输出的数组是。

Numpy可以配置成

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

请参阅numpy.seterr 以控制它如何处理浮点数组中的下溢/溢出等问题。

【讨论】:

    【解决方案2】:

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

    exp(-a) + exp(-b) -> log(exp(-a) + exp(-b))
    

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

    log(exp(-1000) + exp(-1000))
    

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

    log(exp(a) + exp(b)) = m + log(exp(a-m) + exp(b-m))
    

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

    【讨论】:

      【解决方案3】:

      我想你可以用这个方法来解决这个问题:

      标准化

      我克服了这种方法的问题。在使用这种方法之前,我的分类准确率为:86%。使用此方法后,我的分类准确率为:96%!!! 太棒了!
      第一个:
      Min-Max scaling

      秒:
      Z-score standardization

      这些是实现normalization的常用方法。
      我使用第一种方法。我改变它。最大数除以 10。 所以结果的最大个数是10。那么exp(-10)就不是overflow!
      希望我的回答对你有帮助!(^_^)

      【讨论】:

      • 这是题外话。问题是“这个警告的原因是什么?”。它与机器学习的规范化无关。
      【解决方案4】:

      exp(log(a) - log(b)) 不是和exp(log(a/b)) 一样吗,a/b 是一样的吗?

      >>> from math import exp, log
      >>> exp(log(100) - log(10))
      10.000000000000002
      >>> exp(log(1000) - log(10))
      99.999999999999957
      

      2010-12-07:如果是这样“数组 b 中的某些值被故意设置为 0”,那么您实际上是在除以 0。这听起来像是个问题。

      【讨论】:

      • 只要您忽略精度问题,这也是一样的——当您开始计算指数时,这通常很重要。也许 OP 正在尝试实现类似 logsumexp 的东西
      • 我正在使用 logsumexp -- 查看已编辑帖子的修订 -- 这会有所作为吗?
      • @David Cournapeau:这意味着使用日志和 exp 的答案不太精确,对吧?我想,除法更准确。仅供参考。
      • @look at my own answer以了解处理指数时的问题
      【解决方案5】:

      在我的情况下,这是由于数据中的值很大。我必须进行归一化(除以 255,因为我的数据与图像相关)才能按比例缩小值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-13
        • 1970-01-01
        相关资源
        最近更新 更多