python - 使用 numpy 处理 exp 中的溢出

标签 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

这个函数在优化例程中被计算了很多次。它经常引发异常:

RuntimeWarning: overflow encountered in exp

我了解操作数不能存储在为 float 分配的空间中。但是我该如何克服这个问题呢?

最佳答案

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

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

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

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

看看我对这个问题的回答:logit and inverse logit functions for extreme values

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

关于python - 使用 numpy 处理 exp 中的溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9559346/

相关文章:

python - 重新采样 - 无法单独创建训练集和测试集

python - 非常大的矩阵向量积

python - 使用 scipy.optimize.root 查找根

c++ - C/C++ 中两个 INT_MAX 数字的乘积不正确

css - IE7溢出问题

python - 如何让 nosetests 按顺序运行测试?

python - 使用 pip 安装包时出现 ssl 错误

c++ - 在给定值处创建溢出

python - 为什么使用one_hot编码时需要pad_sequences?

python - 在列表中,如何将每个字符串(混合特殊字符)分隔成单个字符?