我熟悉 scipy.optimize.optimize 中的一些函数,并且过去曾使用 fmin_cg 来最小化我知道导数的函数。但是,我现在有一个不容易区分的公式。
该模块中的几个函数(例如 fmin_cg)实际上并不需要提供导数。我假设他们然后通过依次向每个参数添加一个小值来计算准导数 - 这是正确的吗?
我的主要问题是:在没有给定导数的情况下最小化基于多个参数的函数时,最好使用哪个函数(或其他函数)?
请您参考如下方法:
是的,调用任何 fmin_bfgs fmin_cg fmin_powell 作为
fmin_xx( func, x0, fprime=None, epsilon=.001 ... )
通过 (func( x + epsilon I ) - func(x))/epsilon 估计 x 处的梯度。
不过,哪个对您的应用程序“最好”, 很大程度上取决于您的函数的流畅程度以及变量的数量。
Plain Nelder-Mead,fmin,是不错的首选——缓慢但可靠; 不幸的是,无论 x 的大小如何,scipy Nelder-Mead 都以固定大小的单纯形 .05/.00025 开始。
我听说 scipy.optimize.tnc 中的 fmin_tnc 很好:
fmin_tnc( func, x0, approx_grad=True, epsilon=.001 ... ) or
fmin_tnc( func_and_grad, x0 ... ) # func, your own estimated gradient
(fmin_tnc 是具有约束约束的 ~ fmin_ncg,可以看到正在发生的事情的好消息,有些不同的 args。)
