【问题标题】:passing a function with multiple independent variables and multiple arguments to scipy optimize minimize将具有多个自变量和多个参数的函数传递给 scipy 优化最小化
【发布时间】:2020-06-09 06:44:34
【问题描述】:

this question 之后,我想让我的问题尽可能具体,重点放在我无法解决的部分。考虑一个非常简单的函数:

def foo(x, y, a, b, c):
    return a * x**4 + b * y**2 + c

现在我想使用scipy.optimize.minimize 或任何其他现有函数来查找xy(即参数)以最小化foo 给定常量abc(即 args)。如果我只有一个参数和多个参数,那么从this page 我可以这样做:

def foo(x, *args):
    a, b, c = args
    return a * x**4 + b * x**2 + c

# X0 = to some scalar
# ARGS = a tuple of scalars (A, B, C) 

x_min = scipy.optimize.minimize(foo, x0=X0, args=ARGS)

如果我只有自变量,没有常量参数,那么从this page 我可以做到:

def foo(*params):
    x, y = params
    return 4 * x**4 + 2 * y**2 + 1

# P0 = to a list of scalars [X0, Y0] 

x_min = scipy.optimize.minimize(foo, x0=P0)

但是,我不能使用上述任何语法。我相信我必须将我的功能定义为:

def foo(*args, **kwargs):
    x, y = args
    a, b, c = tuple(kwargs.values())
    return a * x**4 + b * y**2 + c

但是我不知道如何将argskwargs 传递给scipy.optimize 函数。如果您能帮助我理解使用多个独立参数和 scipy.optimize 函数的常量参数定义 foo 函数的最佳方法,我将不胜感激。提前感谢您的支持。

【问题讨论】:

    标签: python scipy keyword-argument scipy-optimize scipy-optimize-minimize


    【解决方案1】:

    您可以使用lambdafunctools.partial 自己绑定它们,而不是传递foo 并让scipy 传递常量参数:

    A, B, C = some_const_values
    foo1 = lambda x, y: foo(x, y, A, B, C)
    

    或者:

    import functools
    foo1 = functools.partial(foo, a=A, b=B, c=C)
    

    然后:

    x_min = scipy.optimize.minimize(foo1, ...)
    

    【讨论】:

    • 啊哈,很酷的解决方法。谢谢。所以没有办法在不定义 lambda 或中间函数的情况下将带有 *args, **kwargs 的函数直接传递给 scipy.optimize 函数?
    • 我会在几个小时内对此进行测试,然后回来批准答案。
    • 我试过你的代码。我不确定它是否会按原样工作。我这个x, y 参数需要被粉碎成一个像foo_ = lambda P: foo(P[0], P[1], A, B, C) 然后minimize(foo_, x0=[X0, Y0])。我不会在您的帖子上应用此编辑,您将不会收到任何通知。最好你自己看看。
    • this为例
    猜你喜欢
    • 2018-01-01
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    相关资源
    最近更新 更多