python - 将具有多个自变量和多个参数的函数传递给 scipy optimize minimize

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

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

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

现在我想使用 scipy.optimize.minimize或任何其他现有函数来查找 xy (即参数)以最小化 foo给定常量a , b ,和c (即参数)。如果我只有一个参数和多个参数,那么来自 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

但是我不知道如何通过argskwargsscipy.optimize功能。如果您能帮助我了解定义 foo 的最佳方式,我将不胜感激。具有多个独立参数和常量参数的函数 scipy.optimize功能。感谢您提前的支持。

最佳答案

您可以使用 lambdafunctools.partial 自行绑定(bind)它们,而不是传递 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, ...)

关于python - 将具有多个自变量和多个参数的函数传递给 scipy optimize minimize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60396209/

相关文章:

python - 如何将变量值作为关键字参数键传递?

python - 最初在 python 中创建 chromedriver 时,http.client.BadStatusLine : '' is thrown

python - Pyspark - 如何将 '4 hours' 多个窗口分组聚合

python - scipy.stats 是否对 iqr 进行了错误的计算?

Python:在 scipy.optimize.newton 中将列表作为参数传递

python - Amazon lambda dynamodb update_item() 只接受关键字参数

python - 模拟接受 **kwargs 的函数

python - Flask + uWSGI + Celery - 如何将 Celery 作为守护进程启动

python - 如何正确使用Flask的jsonify()返回json?

python - 使用 pytables,哪个更有效 : scipy. 稀疏矩阵或 numpy 密集矩阵?