我熟悉scipy.optimize.optimize中的一些函数,并且在过去使用fmin_cg来最小化我知道派生的函数。但是,我现在有一个不容易区分的公式。
该模块中的一些功能(例如fmin_cg)实际上并不需要提供衍生物。我假设他们然后通过依次为每个参数添加一个小值来计算一个quazi导数 - 这是正确的吗?
我的主要问题是:在没有给定导数的情况下最小化多个参数的函数时,哪个函数(或其他函数)最好使用?
答案 0 :(得分:3)
我不太熟悉SciPy中可用的内容,但Downhill Simplex方法(又名Nelder-Mead或Amoeba方法)经常适用于多维优化。
现在查看scipy documentation,看起来它在minimize()
函数中可以使用method='Nelder-Mead'
参数作为选项。
不要将它与线性规划的Simplex(Dantzig)算法混淆......
答案 1 :(得分:3)
是的,将fmin_bfgs fmin_cg fmin_powell
中的任何一个称为
fmin_xx( func, x0, fprime=None, epsilon=.001 ... )
按x
估算(func( x + epsilon I ) - func(x)) / epsilon
处的渐变
但是,对于您的应用来说,这是“最好的”,
很大程度上取决于你的功能是多么平滑,以及有多少变量
普通的Nelder-Mead,fmin
,是一个很好的第一选择 - 缓慢但肯定;
不幸的是,狡猾的Nelder-Mead以固定大小的单纯形开始,无论x的大小如何,都是.05 / .00025。
我听说fmin_tnc
中的scipy.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,很好的消息,看看发生了什么,有些不同的args。)