使用numpy处理exp中的溢出

kir*_*off 21 python numpy overflow exp

使用numpy,我有一个函数的定义:

def powellBadlyScaled(X):
    f1 = 10**4 * X[0] * X[1] - 1
    f2 = numpy.exp(-numpy.float(X[0])) + numpy.exp(-numpy.float(X[1])) - 1.0001
    return f1 + f2
Run Code Online (Sandbox Code Playgroud)

在优化例程中,此函数被评估了很多次.它经常引发异常:

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

我知道操作数不能存储在float的已分配空间中.但是我怎样才能克服这个问题呢?

Joh*_*erg 18

您可以使用bigfloat包.它支持任意精度浮点运算.

http://packages.python.org/bigfloat/

import bigfloat
bigfloat.exp(5000,bigfloat.precision(100))
# -> BigFloat.exact('2.9676283840236670689662968052896e+2171', precision=100)
Run Code Online (Sandbox Code Playgroud)

您使用的是功能优化框架吗?它们通常实现价值边界(使用惩罚条款).试试吧.相关价值真的那么极端吗?在优化中,最小化log(f)并不罕见.(近似对数似然等).您确定要优化该exp值而不是log(exp(f))== f.?

看看我对这个问题的答案:极值的logit和inverse logit函数

顺便说一下,如果你所做的只是最小化powellBadlyScaled(x,y)那么最小值是x - > + inf和y - > + inf,所以不需要数字.


Mik*_*rns 5

您可以用来numpy.seterr控制 numpy 在这种情况下的行为方式:http://docs.scipy.org/doc/numpy/reference/ generated/numpy.seterr.html

您还可以使用警告模块来控制如何显示或不显示警告:http://docs.python.org/library/warnings.html