【问题标题】:How to use scipy.optimize.minimize如何使用 scipy.optimize.minimize
【发布时间】:2015-07-20 01:31:42
【问题描述】:

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

我需要使用scipy.optimize.minimize最小化obj()的返回值

我想我需要这样做:

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))

这是正确的吗?为什么我总是出错?

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

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

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

【问题讨论】:

  • 您遇到什么错误?当您尝试在obj 中执行abs(x-v_3) 时,为什么x0 是长度为3 的向量?
  • 我认为这里的简化代码无法生成我得到的错误。所以我想我可以改变我问的方式:它是使用最小化()的正确方法吗?我不认为我告诉 minimize() 哪个变量应该是“x”,哪些变量是静态的。
  • @user2357112 不知何故,我想我部分解决了这个问题。我想我可以用这种方式解释最小化()。它总是将第一个参数(如果有多个)作为自变量。我需要使用 args=(other variables) 声明其他变量。它们应该是相同的顺序。这是正确的吗?

标签: python numpy scipy


【解决方案1】:

对于 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

【讨论】:

  • 最初猜测的目的是什么?
  • 想象您正在搜索某个数学空间,其中包含最优值(即谷形的全局最小值)。最初的猜测只是一个起点——你必须从某个地方开始。最终,从哪里开始并不重要;重要的是你的结局。
【解决方案2】:

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

但是如果你碰巧有一个函数 fun(x, y) 有一些额外的参数 y 需要单独传入(但为了优化的目的被认为是一个常量)?这就是 args 元组的用途。该文档试图解释如何使用 args 元组 实际上, scipy.optimize.minimize 将使用星号参数表示法将 args 中的任何内容作为参数的其余部分传递给 fun:然后在优化期间将该函数称为 fun(x, *args) 。 x 部分由优化器传入,而 args 元组作为剩余参数给出。”

【讨论】:

    猜你喜欢
    • 2019-12-12
    • 2019-11-01
    • 2015-03-18
    • 2015-06-02
    • 2014-01-03
    • 2019-01-23
    • 2019-07-11
    • 1970-01-01
    • 2015-02-19
    相关资源
    最近更新 更多