Skip to main content
 首页 » 编程设计

没有导数的Python函数最小化

2025年05月04日21pengyingh

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

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

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

请您参考如下方法:

是的,调用任何 fmin_bfgs fmin_cg fmin_powell 作为

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

通过 (func( x + epsilon I ) - func(x))/epsilon 估计 x 处的梯度。
不过,哪个对您的应用程序“最好”, 很大程度上取决于您的函数的流畅程度以及变量的数量。
Plain Nelder-Mead,fmin,是不错的首选——缓慢但可靠; 不幸的是,无论 x 的大小如何,scipy 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。)