如何使用 scipy.optimize.minimize

ehf*_*fzv 6 python numpy scipy

我有一个目标函数,比如obj(x, arg_1, arg_2) inside f(),我variable_3 = f(x, arg_1, arg_2) obj()会返回abs(x-variable_3)

我需要尽量减少的返回值obj()使用scipy.optimize.minimize

我想我需要这样做:

def obj(x, arg_1, arg_2)
    v_3 = f(x, arg_1, arg_2)
    return abs(x-v_3)
x0 = 1
result = minimize(obj, x0, args = (arg_1, arg_2))
Run Code Online (Sandbox Code Playgroud)

这样对吗?为什么我总是出错?

或者,实际上我可以这样做:

def obj(x, v_3)
    return abs(x-v_3)
def myfun(arg_1, arg_2)
    x0 = 1
    v_3 = f(x0, arg_1, arg_2)
    result = minimize(obj, x0, args = v_3)
    return result
Run Code Online (Sandbox Code Playgroud)

但显然,这就是我想要的。那么有人可以告诉我如何进行这种最小化吗?谢谢

myn*_*inn 6

对于 scipy.optimize.minimize,应将多个参数打包成一个元组,然后在数值优化期间由目标函数解包。

它应该是这样的:

def obj(arguments)
    """objective function, to be solved."""
    x, arg_1, arg_2 = arguments[0], arguments[1], arguments[2] 
    v_3 = f(x, arg_1, arg_2)
    return abs(x-v_3)

x0 = 1
initial_guess = [1,1,1]  # initial guess can be anything
result = minimize(obj, initial_guess)
print result.x
Run Code Online (Sandbox Code Playgroud)

  • 想象一下您正在搜索某个数学空间,其中包含最佳值(即山谷形式的全局最小值)。最初的猜测只是一个起点——你必须从某个地方开始。最终,从哪里开始并不重要;重要的是你最终会去哪里。 (2认同)

ehf*_*fzv 4

希望它不会导致一些IP问题,在这里引用答案的基本部分:来自@lmjohns3,位于Scipy最小化函数的输入结构 “默认情况下,scipy.optimize.minimize采用一个接受一个参数的函数fun(x) x(可能是数组等)并返回标量。scipy.optimize.minimize 然后找到一个参数值 xp,使得对于 x 的其他值,fun(xp) 小于 fun(x)。优化器负责用于创建 x 的值并将它们传递给 fun 进行评估。

但是,如果您碰巧有一个函数 fun(x, y),它有一些需要单独传入的附加参数 y(但出于优化目的被视为常量),该怎么办?这就是 args 元组的用途。该文档试图解释如何有效地使用 args 元组,scipy.optimize.minimize 将使用星号参数符号将 args 中的任何内容作为参数的其余部分传递给 fun:然后将该函数调用为 fun(x, * args)在优化期间。x 部分由优化器传入,args 元组作为剩余参数给出。”