scipy.optimize.differential_evolution是否支持处理量级差异大的参数?
参数量级差异较大场景下differential_evolution的使用说明
核心结论
scipy.optimize.differential_evolution 本身不支持类似 leastsq 的自动参数缩放能力,面对量级差异较大的参数时,建议提前做归一化处理后再传入优化。
原因说明
- 差分进化属于启发式优化算法,核心的变异、交叉逻辑都依赖参数空间的欧氏距离计算。当不同参数的量级差超过2个数量级以上时,量级更大的参数会完全主导距离计算结果,量级小的参数的调整几乎不会对优化方向产生影响,最终会出现收敛速度慢、收敛结果落入局部最优的问题。
- lmfit对
differential_evolution的封装仅做了参数边界传递、结果格式映射的适配,没有额外添加自动参数缩放的逻辑,这一点和leastsq的封装逻辑有明显区别:leastsq是基于梯度的最小二乘优化器,lmfit在封装时会自动基于参数初始值做缩放适配,所以可以直接处理量级差异较大的参数场景。
实践方案
你可以选择以下任意一种方式处理:
- 手动对所有参数做线性缩放,统一将参数的取值范围映射到[0,1]或者[-1,1]区间,优化完成后再反向映射回原始量级即可
- 不想手动做映射的话,也可以在定义lmfit的
Parameter对象时,调整不同参数的min、max取值,让所有参数的边界范围落在相近量级,间接实现缩放效果
内容的提问来源于stack exchange,提问作者Jean Carlo Machado
相关产品推荐
相关产品推荐

