Python中scipy / numpy中的exp溢出?

时间:2010-12-05 16:55:48

标签: python numpy scipy

以下错误是什么:

Warning: overflow encountered in exp
使用Python的scipy / numpy中的

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

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

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

这个警告的原因是什么?感谢。

5 个答案:

答案 0 :(得分:25)

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

Numpy可以配置为

  1. 忽略这些错误,
  2. 打印错误,但不会发出警告以停止执行(默认)
  3. 记录错误,
  4. 提出警告
  5. 提出错误
  6. 调用用户定义的函数
  7. 请参阅numpy.seterr以控制它如何处理浮点数组中的欠/溢等等。

答案 1 :(得分:8)

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

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

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

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大不相同),但它避免了最终结果中的大多数精度问题

答案 2 :(得分:3)

我认为您可以使用此方法来解决此问题:

  

归一化的

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

Min-Max scaling

第二:
Z-score standardization

Z-score standardization

这些是实施normalization的常用方法 我使用第一种方法。我改变它。最大数量除以10。 因此,结果的最大数量为10.然后exp(-10)将不是overflow
我希望我的回答能帮到你!(^ _ ^)

答案 3 :(得分:2)

exp(log(a) - log(b))exp(log(a/b))的{​​{1}}是否相同?

a/b

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

答案 4 :(得分:0)

就我而言,这是由于数据中的值很大。我必须规范化(除以255,因为我的数据与图像有关)才能将值缩小。