【问题标题】:Structure of inputs to scipy minimize functionscipy 最小化函数的输入结构
【发布时间】:2013-11-19 13:25:43
【问题描述】:

我继承了一些代码,它试图使用scipy.optimize.minimize 最小化一个函数。我无法理解 funjac 参数的一些输入

最小化调用看起来像这样:

result = minimize(func, jac=jac_func, args=(D_neg, D, C), method = 'TNC' ...other arguments)

func 如下所示:

def func(G, D_neg, D, C):
#do stuff

jac_func 具有以下结构:

def jac_func(G, D_neg, D, C):
#do stuff

我不明白G 输入到funcjac_func 的来源。这是在minimize 函数中以某种方式指定的,还是method 被指定为TNC 的事实?我试图对这个优化函数的结构进行一些研究,但我无法找到我需要的答案。非常感谢任何帮助

【问题讨论】:

    标签: python numpy scipy minimize


    【解决方案1】:

    简短的回答是,G 由优化器维护,作为最小化过程的一部分,而 (D_neg, D, and C) 参数按原样从 args 元组传入。

    默认情况下,scipy.optimize.minimize 接受一个函数fun(x),它接受一个参数x(可能是一个数组等)并返回一个标量。然后scipy.optimize.minimize 找到一个参数值xp 使得fun(xp) 对于x 的其他值小于fun(x)。优化器负责创建x 的值并将它们传递给fun 进行评估。

    但是如果你碰巧有一个函数fun(x, y) 有一些额外的参数y 需要单独传递(但为了优化的目的被认为是一个常量)?这就是 args 元组的用途。 documentation 试图解释如何使用 args 元组,但它可能有点难以解析:

    参数:元组,可选

    传递给目标函数及其导数(Jacobian、Hessian)的额外参数。

    实际上,scipy.optimize.minimize 将使用星号参数表示法将args 中的任何内容作为参数的其余部分传递给fun:然后在优化期间将函数调用为fun(x, *args)x 部分由优化器传入,args 元组作为剩余参数给出。

    因此,在您的代码中,G 元素的值由优化器维护,同时评估 G 的可能值,(D_neg, D, C) 元组按原样传递。

    【讨论】:

    • 很好的解释!通常你会猜测你期望G 是什么,比如G0。因此,您可以使用minimize(func, jac=jac_func, G0, args=(...,), ...),而不是 OP 中的表单。如果你没有通过,它通常以G=1. 开头,我认为这种形式不太容易混淆,即使G0=1. 也是如此。
    • 我同意,最好能更明确地说明对 G0 的最初猜测——事实上,我从未见过对 minimize 的调用忽略了它。
    • @lmjohns3 @askewchan:最初的猜测 x0 不是可选参数,正如您在文档中看到的那样。用户必须始终明确指定它,并且没有默认值。
    • @pv。果然,谢谢!我已经稍微更新了我的答案,以使它听起来不像最小化器从无处为x 创造价值。
    • @pv。很好 --- 碰巧几乎所有的 scipy.optimize 函数都需要起点,当然除了我最近使用的那个:curve_fit,它确实有一个默认值 1.0。我想知道为什么它从 OP 中消失了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 2018-01-30
    • 2015-02-18
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多