np.exp溢出解决方法

时间:2018-11-07 21:23:36

标签: python numpy

我有以下等式:

result = (A * np.exp(b * (t - t0))) / (1 + np.exp(c * (t - t0)))

我输入t值的数组以得出结果。 A, b, c, t0都是常数(bc很大,t0很小,但不比b和c大)。问题是,由于指数值很快变得太大而无法容纳超过t的一定范围的float64,所以我遇到了溢出错误。我正在尝试找到一种解决方法,同时仍保持适当的精度。 result的值很好地位于float64容器的范围内,但是np.exp计算的中间值过大阻止了我深入研究结果。

我有一些想法:

  • 缩小t输入以获取所需的值范围,然后对输出进行缩放以使结果正确
  • 将指数转换为对数函数

但是,我不确定如何实现这些想法,或者它们是否会真正起作用。

本质上讲,这个问题可以归结为result = np.exp(a) / np.exp(b),其中a和b在100-1000的范围内。 np.exp(709)的结果为8.2e307,恰好是float64的上限,但是我需要输入更大的值。虽然两个指数的比较产生了一个合理的值,但指数本身太大而无法计算。

1 个答案:

答案 0 :(得分:1)

将所有内容保持在对数范围内是解决此类问题的常见方法。至少这是我们在统计中所做的,您经常处于1e-10000范围内,尤其是在开始接近收敛之前。例如,所有scipy概率密度函数都有logpdf变体,它们在对数刻度上起作用。

我认为您的表情将被重写为:

d = t - t0
log_result = (np.log(A) + (b * d)) - np.logaddexp(0, c * d)

(未经测试)