1

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

该模块中的一些函数(例如 fmin_cg)实际上并不需要提供导数。我假设他们然后通过依次为每个参数添加一个小值来计算准导数 - 对吗?

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

4

2 回答 2

3

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

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

不要将它与用于线性规划的 Simplex (Dantzig) 算法混淆...

于 2012-03-08T05:50:52.327 回答
3

是的,调用任何fmin_bfgs fmin_cg fmin_powellas

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_tncinscipy.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 具有绑定约束,很好的消息可以看到正在发生的事情,有些不同的参数。)

于 2012-03-14T10:47:38.690 回答