下面的错误是什么:
Warning: overflow encountered in exp
在scipy/numpy中使用Python通常意味着?我正在计算一个对数形式的比率,即log(a) + log(b),然后取结果的指数,使用exp,并将sum与logsumexp一起使用,如下所示:
c = log(a) + log(b)
c = c - logsumexp(c)
数组B中的一些值被有意设置为0。他们的日志将是-Inf。
此警告的原因可能是什么?谢谢。
发布于 2010-12-05 17:25:59
在您的示例中,这意味着b
在数组中的某处非常小,并且您得到的数字(a/b
或exp(log(a) - log(b))
)对于用于存储输出的数组的任何数据类型(float32、float64等)来说都太大了。
Numpy可以配置为
参见numpy.seterr
以控制它如何处理浮点数组中的欠/溢出等。
发布于 2010-12-08 03:40:00
当你需要处理指数时,你很快就会进入下/上流,因为函数增长得太快了。一个典型的例子是统计,其中不同幅度的指数求和是很常见的。由于数量非常大/很小,所以通常会将日志保持在一个“合理”的范围内,即所谓的对数域:
exp(-a) + exp(-b) -> log(exp(-a) + exp(-b))
问题仍然存在,因为exp(-a)仍然会下溢。例如,exp(-1000)已经低于您可以表示为双精度数的最小数字。举个例子:
log(exp(-1000) + exp(-1000))
给出了对数( -inf (0 + 0)),即使您可以手动获得类似于-1000的值(-1000 + log(2))。函数logsumexp做得更好,它提取数字集的最大值,并将其从日志中取出:
log(exp(a) + exp(b)) = m + log(exp(a-m) + exp(b-m))
它不能完全避免下溢(例如,如果a和b非常不同),但它避免了最终结果中的大多数精度问题。
发布于 2015-12-19 09:22:22
我认为你可以使用这个方法来解决这个问题:
规格化
我用这种方法克服了这个问题。在使用此方法之前,我的分类准确率为:86%。使用此方法后,我的分类准确率为:96%!太棒了!
首先:
第二:
这些是实现normalization
的常用方法。
我使用第一种方法。然后我改变它。最大数除以10,所以结果的最大数是10,那么exp(-10)就不是overflow
!
希望我的回答能对你有所帮助!(^_^)
https://stackoverflow.com/questions/4359959
复制