python - 在 Python 中找到带边界的函数的最大值

标签 python python-3.x scipy max

我想找到函数 f(x) 的局部最大值,其中 x 可以介于两个固定值之间,因为如果 x 趋于 +inf,f(x) 将趋于 +inf。我一直在尝试使用诸如 scipy.optimize.fmin_l_bfgs_bscipy.optimize.fmin_tnc (来自 scipy.ref 指南)之类的算法,但我不知道如何正确设置边界。 (我知道,这一定很愚蠢,但我是 Python 的菜鸟)。让我们举一个简单的例子:

>>>import scipy.optimize as opt  
>>>import scipy  
>>>from numpy import *  

>>>def f (x): return x**(1/2.0)  
>>>max_x = opt.fmin_l_bfgs_b(lambda x: -f(x), [0,0], bounds=([0,0],[9,0])) #I want x to range between 0 and 9 and fmax be 3

虽然输出很奇怪:我什么也没得到!甚至没有错误!我错过了什么?

最佳答案

边界参数变为 [(lower1,upper1),(lower2,upper2)],而不是 [(lower1,lower2),(upper1,upper2)]。如果您查看结果 (max_x),您会看到“错误:没有可行的解决方案”,我猜这是因为您的边界指定了一个空集。

这是调用函数的正确方法。我假设平方根只是一个例子。我改用 -x**2。

import scipy.optimize as opt
import scipy
from numpy import *
def f(x):
    print x
    return -x**(2)

max_x = opt.fmin_l_bfgs_b(lambda x: -f(x), 1.0, bounds=[(-9,9)],approx_grad=True)

因为没有指定梯度函数,所以需要设置approx_grad=True。 1.0 是我对最大值的初始猜测(尽管在这个例子中它显然为零)。我添加了一个 print 语句,以便每次调用该函数时都能看到,但这通常不是必需的。有关调用 fmin_l_bfgs_b 的不同方式的更多详细信息,请参阅 here .

以上代码的结果是:

[ 1.]
[ 1.]
[ 1.00000001]
[-0.99999999]
[-0.99999999]
[-0.99999998]
[ 0.001]
[ 0.001]
[ 0.00100001]
[ -5.01108742e-09]
[ -5.01108742e-09]
[  4.98891258e-09]

max_x 看起来像这样:

(array([ -5.01108742e-09]),
 array([  2.51109971e-17]),
 {'funcalls': 4,
  'grad': array([ -2.21748344e-11]),
  'task': 'CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL',
  'warnflag': 0})

关于python - 在 Python 中找到带边界的函数的最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16781115/

相关文章:

python - 非常轻量级的网站框架推荐

python-3.x - 如何修复 Colaboratory 中的 zipfile 读取错误?

python人脸识别慢

python - 使用 numpy/scipy 在 python 中均匀有效地采样整数

python - hadoop distcp 使用 subprocess.Popen

python - 命令在终端或程序(Python 和 C++)中给出不同的行为

Python - TypeError : tuple indices must be integers or slices, 不是 str

python - 为什么 stat_density (R; ggplot2) 和 gaussian_kde (Python; scipy) 不同?

python - 具有至少 k 个点的 Numpy 查找区间

python - 沿 numpy 数组的一个轴随机保留不为零的单个元素