2

我想找到函数 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

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

4

2 回答 2

4

bounds 参数是 [(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 是我对最大值的最初猜测(尽管在这个例子中它显然是零)。我添加了一个打印语句,以便每次调用该函数时都可以看到,但这通常不是必需的。有关调用 fmin_l_bfgs_b 的不同方式的更多详细信息,请参见此处

上面的代码导致:

[ 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})
于 2013-05-27T22:46:13.403 回答
3

为什么要使用多元最小化器?试试scipy.optimize.fminbound

max_x = opt.fminbound(lambda x: -f(x), 0, 9)
于 2013-05-27T22:45:23.360 回答