我继承了一些试图使用scipy.optimize.minimize
来最小化函数的代码。我无法理解fun
和jac
参数
最小化调用看起来像这样:
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
我不明白的是func
和jac_func
的G输入来自哪里。是以minimize
函数中的某种方式指定的,还是method
被指定为TNC
的事实?我试图对这个优化函数的结构进行一些研究,但是我找不到我需要的答案。非常感谢任何帮助
答案 0 :(得分:37)
简短的回答是,G
由优化器维护,作为最小化过程的一部分,而(D_neg, D, and C)
参数从args
元组按原样传入。
默认情况下,scipy.optimize.minimize
接受一个函数fun(x)
接受一个参数x
(可能是一个数组等)并返回一个标量。 scipy.optimize.minimize
然后会找到参数值xp
,以使fun(xp)
小于fun(x)
其他x
值。优化程序负责创建x
的值并将其传递给fun
进行评估。
但是如果你碰巧有一个函数fun(x, y)
有一些额外的参数y
需要单独传递(但是为了优化而被认为是常量)会怎样?这就是args
元组的用途。 documentation试图解释如何使用args元组,但是解析起来有点困难:
args:元组,可选
传递给目标函数及其衍生物的额外参数(Jacobian,Hessian)。
实际上,scipy.optimize.minimize
将使用星号参数表示法将args
中的任何内容传递给fun
的其余参数:该函数随后被称为fun(x, *args)
在优化期间。 x
部分由优化器传入,args
元组作为剩余参数给出。
因此,在您的代码中,优化程序在评估G
的可能值时保留G
元素的值,并按原样传递(D_neg, D, C)
元组。