背景
我有一个函数,它接受多个参数并返回一个错误度量,然后我想最小化它(使用scipy.optimize.leastsq
,但现在这不是重点)。
作为一个玩具示例,假设我的优化函数采用四个参数 a、b、c、d:
def f(a,b,c,d):
err = a*b - c*d
return err
然后,优化器需要一个带有参数向量的签名的func(x, *args)
函数。x
也就是说,我的函数目前写成这样:
def f_opt(x, *args):
a,b,c,d = x
err = a*b - c*d
return err
但是,现在我想做一些实验来修复一些参数,同时在优化步骤中保留一些参数。
我当然可以做类似的事情:
def f_ad_free(x, b, c):
a, d = x
return f(a,b,c,d)
但这会很麻烦,因为我有超过 10 个参数,这意味着不同数量的自由与固定参数的组合可能会非常大。
使用字典的第一种方法
我的一个解决方案是用关键字 args 而不是位置 args 编写我的内部函数f
,然后像这样包装解决方案:
def generate(func, all_param, fixed_param):
param_dict = {k : None for k in all_param}
free_param = [param for param in all_param if param not in fixed_param]
def wrapped(x, *args):
param_dict.update({k : v for k, v in zip(fixed_param, args)})
param_dict.update({k : v for k, v in zip(free_param, x)})
return func(**param_dict)
return wrapped
创建一个修复“b”和“c”的函数然后变成以下内容:
all_params = ['a','b','c']
f_bc_fixed = generate(f_inner, all_params, ['b', 'c'])
a = 1
b = 2
c = 3
d = 4
f_bc_fixed((a,d), b, c)
提问时间!
我的问题是是否有人能想出一种更巧妙的方法来解决这个问题。由于最终函数将在优化步骤中运行,因此我不能为每个函数调用接受太多开销。生成优化函数所需的时间无关紧要。