我熟悉 scipy.optimize.optimize 中的一些函数,并且过去曾使用 fmin_cg 来最小化我知道导数的函数。但是,我现在有一个不容易区分的公式。
该模块中的一些函数(例如 fmin_cg)实际上并不需要提供导数。我假设他们然后通过依次为每个参数添加一个小值来计算准导数 - 对吗?
我的主要问题是:在没有给定导数的多个参数上最小化函数时,哪个函数(或其他函数)最好使用?
我熟悉 scipy.optimize.optimize 中的一些函数,并且过去曾使用 fmin_cg 来最小化我知道导数的函数。但是,我现在有一个不容易区分的公式。
该模块中的一些函数(例如 fmin_cg)实际上并不需要提供导数。我假设他们然后通过依次为每个参数添加一个小值来计算准导数 - 对吗?
我的主要问题是:在没有给定导数的多个参数上最小化函数时,哪个函数(或其他函数)最好使用?
我不太熟悉 SciPy 中可用的内容,但Downhill Simplex方法(又名 Nelder-Mead 或 Amoeba 方法)通常适用于多维优化。
现在查看scipy 文档,看起来它可以作为minimize()
使用参数的函数中的一个选项使用method='Nelder-Mead'
。
不要将它与用于线性规划的 Simplex (Dantzig) 算法混淆...
是的,调用任何fmin_bfgs fmin_cg fmin_powell
as
fmin_xx( func, x0, fprime=None, epsilon=.001 ... )
x
通过估计梯度(func( x + epsilon I ) - func(x)) / epsilon
。
但是,哪个对您的应用程序“最好”很大程度上取决于您的函数的平滑程度以及变量的数量。
Plain Nelder-Mead, fmin
, 是一个不错的首选——缓慢但肯定;不幸的是,scipy Nelder-Mead 以固定大小的单纯形 0.05 / .00025 开始,无论 x 的比例如何。
我听说fmin_tnc
inscipy.optimize.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 具有绑定约束,很好的消息可以看到正在发生的事情,有些不同的参数。)