没有派生的Python函数最小化

时间:2012-03-08 05:40:40

标签: python scipy derivative minimization

我熟悉scipy.optimize.optimize中的一些函数,并且在过去使用fmin_cg来最小化我知道派生的函数。但是,我现在有一个不容易区分的公式。

该模块中的一些功能(例如fmin_cg)实际上并不需要提供衍生物。我假设他们然后通过依次为每个参数添加一个小值来计算一个quazi导数 - 这是正确的吗?

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

2 个答案:

答案 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。)