Python函数定义时的参数解包:实现scipy curve_fit动态参数适配
解决方案
核心思路不需要动态修改函数定义的参数名,scipy.optimize.curve_fit 会按顺序传递待拟合参数,我们直接用可变参数*args接收后按规则拆分即可:
调整后的完整代码示例
import numpy as np from scipy.optimize import curve_fit def get_optimal_adstock_multivariate(x_var_names, final_df): y = np.array(final_df['Count Of Solutions']) n = len(x_var_names) # 生成参数名列表,后续用来映射最优结果 coef_vars = [f"b{i+1}" for i in range(n)] rates = [f"rate_{i+1}" for i in range(n)] all_param_names = ["b0"] + coef_vars + rates def f(df, b0, *args): # args顺序和你定义的coef_vars + rates完全一致 # 前n个为系数b,后n个为衰减率rate coefs = args[:n] rate_params = args[n:] # 这里替换为你自己的模型计算逻辑,以下是adstock模型示例 pred = b0 for idx in range(n): # 计算当前变量的adstock值 col_vals = df[x_var_names[idx]] # 示例adstock计算:滞后加权求和 adstock = 0 adstock_vals = [] for val in col_vals: adstock = val + rate_params[idx] * adstock adstock_vals.append(adstock) pred += coefs[idx] * np.array(adstock_vals) return pred # 调用curve_fit求解最优参数 popt, pcov = curve_fit(f, final_df, y) # 把结果和参数名绑定,方便调用 optimal_params = dict(zip(all_param_names, popt)) return optimal_params, popt, pcov
逻辑说明
- 拟合函数
f用*args接收所有动态生成的待拟合参数,不需要显式定义每个参数名 - 参数顺序和你提前生成的
coef_vars + rates列表完全对应,按长度拆分后即可按索引取用 - 求解完成后可以直接把最优值和你预设的参数名做映射,得到
b1、rate_1等对应参数的最优结果
内容的提问来源于stack exchange,提问作者Nate
相关产品推荐
相关产品推荐

