如何在最小化两函数之和时允许两个函数的x参数独立变化
结论
完全可以用scipy.optimize实现该需求,不需要引入额外的Python模块。
实现思路
你只需要将原来的3维优化参数扩展为4维,把f和g的独立参数拆分开即可。以你需要让x参数在两个函数中独立变化为例,优化参数列表从[x, y, z]调整为[x_f, x_g, y, z],其中:
x_f是传给f函数的x参数x_g是传给g函数的x参数- y、z仍然是两个函数共享的参数
修改后代码示例
import scipy.optimize as op def f(x,y,z): return scalar # 你的f函数原有实现 def g(x,y,z): return another_scalar # 你的g函数原有实现 def h(theta): # 拆分独立参数和共享参数 x_f, x_g, y, z = theta return f(x_f, y, z) + g(x_g, y, z) def bestfit(guess, method='Nelder-Mead'): result = op.minimize(h, guess, method=method, options={'maxfev': 5000, 'disp': False}) if not result.success: print('Optimisation did not converge.') return result # 初始猜测对应4个参数:x_f初始值、x_g初始值、y初始值、z初始值 # 可根据业务需求给两个x设置相同或不同的初始值 g = [x0, x0, y0, z0] bf = bestfit(g, method='Nelder-Mead') # 优化结果的x属性依次为x_f最优值、x_g最优值、y最优值、z最优值 print(bf)
补充说明
如果后续需要让更多参数在两个函数间独立变化,只需要按照同样的逻辑扩展优化参数的维度,把独立参数拆分、共享参数保留即可。如果你的函数存在多个局部最优解,需要全局优化能力,可以直接使用scipy.optimize自带的basinhopping、differential_evolution等方法,无需引入第三方库。
内容的提问来源于stack exchange,提问作者psi
相关产品推荐
相关产品推荐

