调用SciPy的dual_annealing优化器时遇参数错误求助
调用SciPy的dual_annealing优化器时遇参数错误求助
嗨,我来帮你搞定这两个报错问题,咱们逐个分析:
第一个错误:TypeError: dual_annealing() got an unexpected keyword argument 'options'
SciPy里的dual_annealing和minimize这类优化器不一样,它不支持options字典参数,所有的配置参数(比如maxiter)都是直接作为关键字参数传递的,不需要打包进options里。所以你第一个写法里的options={"maxiter": budget}是错的,直接改成maxiter=budget就行。
第二个错误:TypeError: objective_function() takes from 2 to 3 positional arguments but 7 were given
这个问题出在目标函数定义和你传入的args不匹配上:
- 你的目标函数
func定义是def func(params, y, penalty_list=None):,除了优化变量params外,只接受1个必填参数y和1个可选参数penalty_list,总共最多3个参数。 - 但你传入的
args是[df_1, df_2, df_3, df_4, df_5, name],一共6个参数,加上params的话,调用func时就会传入7个参数,自然就报错了。
解决办法:
要么调整目标函数的参数列表,让它能接收你传入的这6个额外参数;要么把这6个参数打包成一个对象(比如字典、元组),减少args的元素数量。举个例子,调整函数定义的写法:
import scipy.optimize as spo # 尽量别用eval,直接引用函数更安全简洁 optimizer = spo.dual_annealing # 调整函数参数,和args里的6个元素对应 def func(params, df_1, df_2, df_3, df_4, df_5, name): # 这里写你的计算逻辑,params是优化的参数数组 <more code here> args = [df_1, df_2, df_3, df_4, df_5, name] # 正确的调用方式,直接传maxiter,不用options result = optimizer(func, bounds=[(0, 1)] * len(df_values), args=args, maxiter=budget)
另外提一句,尽量避免用eval(optimizer_fn)这种写法,不仅有安全风险,如果字符串写错了还容易出奇怪的错误,直接写optimizer = spo.dual_annealing就好。
备注:内容来源于stack exchange,提问作者madmatrix
相关产品推荐
相关产品推荐

