将附加参数传递给 objective 函数
Pass additional parameters to an objective function
我正在尝试解决以下结构的最小化问题:
res=minimize(objective_fnc, x0, args=param, method='Nelder-Mead)
我需要传递一系列参数,这些参数不是优化变量的一部分,而是参数,以更通用的方式改变问题的 conditions/boundaries。例如,变量 param 是一个带有下一个参数的元组:param = (p1,p2,p3)
每当我调用 objective_fnc
时,我需要传递初始条件 x0
和带有参数的元组,以便在 objective 函数中使用这些参数。例如,objective_fnc(x0,param)
问题是我得到这个错误:objective_fnc() takes 2 positional arguments but 4 were given
我知道如果我传递初始条件和参数(不是元组的一部分,这样:objective_fnc(x0,p1,p2,p3)
)它可以工作,但我想以更简化的方式编写它以防万一稍后我需要传递额外的参数。
这里有 minimal reproducible example 有效,其中所有参数都一一传递。但是,如果我将 p1,p2,p3
更改为 `param',则会出现错误。
import numpy as np
from scipy.optimize import minimize
def objective_fnc(x,p1,p2,p3):
"""The Rosenbrock function"""
return sum(100.0*(x[1:]-x[:-1]**2.0)**2.0 + (1-x[:-1])**2.0)
class CallbackFunctor:
def __init__(self, obj_fun):
self.num_calls = 0
if self.num_calls == 0:
print('Optimization problem started')
self.obj_fun = obj_fun
def __call__(self, x):
fun_val = self.obj_fun(x,p1,p2,p3)
self.num_calls += 1
if self.num_calls % 5 == 0:
print('Work in progress...')
print(p1)
print(p2)
print(p3)
cb = CallbackFunctor(objective_fnc)
# Parameters
p1=10
p2=20
p3=30
param=(p1,p2,p3)
x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])
res = minimize(objective_fnc, x0, args=(p1,p2,p3), method='nelder-mead', callback=cb, options={'xatol': 1e-8, 'disp': True})
print(res.x)
如果您的函数具有签名 objective_func(x, bound_limits)
,其中 bounds_limits
是一个元组,您需要确保解包 args 产生一个元组。因此,您需要传递一个元组的 Iterable:
bound_limits = (param1,param2,param3,param4,param5,param6,param7,param8)
res = minimize(objective_fnc, x0, args=(bound_limits,), method='Nelder-Mead)
请注意,不需要 args
参数。您可以使用 lambda 函数实现相同的目的:
res = minimize(lambda x: objective_fnc(x, bound_limits), x0, method='Nelder-Mead')
尝试使用 unpatch :
objective_fnc(Xo, *bound_limits)
https://stackabuse.com/unpacking-in-python-beyond-parallel-assignment
我正在尝试解决以下结构的最小化问题:
res=minimize(objective_fnc, x0, args=param, method='Nelder-Mead)
我需要传递一系列参数,这些参数不是优化变量的一部分,而是参数,以更通用的方式改变问题的 conditions/boundaries。例如,变量 param 是一个带有下一个参数的元组:param = (p1,p2,p3)
每当我调用 objective_fnc
时,我需要传递初始条件 x0
和带有参数的元组,以便在 objective 函数中使用这些参数。例如,objective_fnc(x0,param)
问题是我得到这个错误:objective_fnc() takes 2 positional arguments but 4 were given
我知道如果我传递初始条件和参数(不是元组的一部分,这样:objective_fnc(x0,p1,p2,p3)
)它可以工作,但我想以更简化的方式编写它以防万一稍后我需要传递额外的参数。
这里有 minimal reproducible example 有效,其中所有参数都一一传递。但是,如果我将 p1,p2,p3
更改为 `param',则会出现错误。
import numpy as np
from scipy.optimize import minimize
def objective_fnc(x,p1,p2,p3):
"""The Rosenbrock function"""
return sum(100.0*(x[1:]-x[:-1]**2.0)**2.0 + (1-x[:-1])**2.0)
class CallbackFunctor:
def __init__(self, obj_fun):
self.num_calls = 0
if self.num_calls == 0:
print('Optimization problem started')
self.obj_fun = obj_fun
def __call__(self, x):
fun_val = self.obj_fun(x,p1,p2,p3)
self.num_calls += 1
if self.num_calls % 5 == 0:
print('Work in progress...')
print(p1)
print(p2)
print(p3)
cb = CallbackFunctor(objective_fnc)
# Parameters
p1=10
p2=20
p3=30
param=(p1,p2,p3)
x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])
res = minimize(objective_fnc, x0, args=(p1,p2,p3), method='nelder-mead', callback=cb, options={'xatol': 1e-8, 'disp': True})
print(res.x)
如果您的函数具有签名 objective_func(x, bound_limits)
,其中 bounds_limits
是一个元组,您需要确保解包 args 产生一个元组。因此,您需要传递一个元组的 Iterable:
bound_limits = (param1,param2,param3,param4,param5,param6,param7,param8)
res = minimize(objective_fnc, x0, args=(bound_limits,), method='Nelder-Mead)
请注意,不需要 args
参数。您可以使用 lambda 函数实现相同的目的:
res = minimize(lambda x: objective_fnc(x, bound_limits), x0, method='Nelder-Mead')
尝试使用 unpatch :
objective_fnc(Xo, *bound_limits)
https://stackabuse.com/unpacking-in-python-beyond-parallel-assignment