没有导数的Python函数最小化



我熟悉scipy.optimize.moptimize中的一些函数,过去曾使用fmin_cg最小化我知道导数的函数。然而,我现在有一个不容易区分的公式。

该模块中的几个函数(例如fmin_cg)实际上并不需要提供导数。我假设他们通过依次给每个参数加一个小值来计算quazi导数,这是正确的吗?

我的主要问题是:当在没有给定导数的情况下最小化多个参数上的函数时,哪个函数(或其他函数)是最好的?

是,将任何fmin_bfgs fmin_cg fmin_powell调用为

fmin_xx( func, x0, fprime=None, epsilon=.001 ... )

通过CCD_ 3来估计CCD_
不过,哪一个对您的应用程序"最好",很大程度上取决于函数的平滑程度以及变量的数量
Plain Nelder Mead,fmin,是一个不错的首选——缓慢但肯定;不幸的是,无论x的尺度如何,狡猾的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。)

我不太熟悉SciPy中的可用内容,但Downhill Simplex方法(又名Nelder Mead或Amoeba方法)通常适用于多维优化。

现在查看scipy文档,它似乎可以作为minimize()函数中的一个选项使用method='Nelder-Mead'参数。

不要把它和线性规划的单纯形(Dantzig)算法混淆。。。

最新更新