SciPy.optimize显示所有迭代的输入和输出值

6

我正在使用scipy.optimize.minimize函数来寻找一个函数的最优值。下面是一个使用内置的Rosenbrock函数的最简单的例子:

>>> from scipy.optimize import minimize, rosen
>>> x0 = [1.3, 0.7, 0.8, 1.9, 1.2]
>>> # Minimize returns a scipy.optimize.OptimizeResult object...
>>> res = minimize(rosen, x0, method='Nelder-Mead') 
>>> print res
  status: 0
    nfev: 243
 success: True
     fun: 6.6174817088845322e-05
       x: array([ 0.99910115,  0.99820923,  0.99646346,  0.99297555,  0.98600385])
 message: 'Optimization terminated successfully.'
     nit: 141
x 只是最终的、最佳的输入向量。我能否从返回的 scipy.optimize.OptimizeResult 对象中获取所有迭代的列表(即带有相应输入向量的目标函数)?

1
https://dev59.com/a2Qn5IYBdhLWcg3wj3zz - cel
1
@cel 回答不错,但是在 callbackF() 函数中的 print 命令正在重新评估 rosen() 目标函数。在这种情况下,这样做可能没问题,但对于一个昂贵的目标函数来说,为了查看它的值而再次计算结果是不可接受的!有没有一种方法可以直接从回调函数中获取结果呢? - feedMe
通常情况下,您不需要这些中间结果。计算/存储它们只会大大减慢算法的速度。快速算法不能为了性能而提供那种信息。 - cel
@cel 好的,在大部分需要高成本目标,比如工程模拟的情况下,算法速度与模拟时间相比微不足道。所以我对优化算法的速度并不感兴趣,我只关心它能够决定下一次迭代使用哪个输入向量。而且我希望在运行结束时能够获得所有信息,而不必重新运行同样的模拟!我不需要中间结果,只想在最后得到所有结果! - feedMe
1
虽然有点笨拙,但你可以将它整合到你的函数中以最小化 - 每次调用时要么打印出来(控制台或文件),要么将每次调用的数据追加到(全局)列表中以供稍后查看。看一下算法如何处理业务还是很有意思的(偶尔一两次)。 - Jon Custer
显示剩余8条评论
1个回答

0

是的,您可以添加可选参数'return_all'

例如:

from scipy.optimize import minimize

def f(params):
    x1, x2 = params
    f = 4 * ((x1**2+(10-x2)**2)**0.5 - 10)**2 \
    + (1/2)*((x1**2+(10+x2)**2)**0.5-10)**2 \
    -5*(x1+x2)
    return f

x0 = [-4, 4]

res = minimize(f, x0, method='CG', options={'return_all':True})

# This example returns all iteration.

注意:选项并不适用于所有优化方法。例如,元启发式算法“差分进化”就没有这个参数。 - rafael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接