scipy 中的步长优化最小化

Step size in scipy optimize minimize

我正在 运行 通过改变 3 个参数进行模拟。对于每个模拟,我都会计算一个指数,告诉我模拟是否正在改进(较低的指数)。 为此,我使用 scipy.optimize.minimize 但我不确定哪种方法最好(我正在尝试了解更多)。

def launcher(x0):
    #varying parameters#
    varying_p(x0[0], x0[1], x0[2])
    run_sim(simulation)
    results = import_results(simulation)
    indexes = index_calc(Data_from,Data_to,simulation,results)
    value = indexes['CHI_tot'].iloc[-1]
    return value

每个参数都在我用“界限”表示的范围内变化。

当我启动模拟时,每个参数的变化都非常小。将有一种方法不仅可以定义变化范围,还可以定义每个参数的步长(例如步长为 50

这有助于更快地获得优化结果?

v_cp = 999.209
v_rho = 1249.94
v_lambda = 0.2815

initialcond = np.array([v_cp, v_rho, v_lambda])
# Bounds: valid only for method L-BFGS-B, TNC, SLSQP, Powell, and trust-constr
bounds = [(400,1600), (400,1600), (0.1, 1.2)]

res = minimize(launcher, initialcond , bounds=bounds, method='L-BFGS-B', options = {'maxiter':10})

print(res.x)

所有 SciPy 基于梯度的优化器(L-BFGS-B、SLSQP 等)都期望 - 显然 - objective 函数的梯度。如果你不提供,他们会尝试用一些小得离谱的步长(比如 10^-6)为你计算一个数值。这可能就是你所看到的。一些“解决方法”:

  1. 我好像记得有些优化器允许你设置梯度计算的步长(“eps”参数)

  2. (更好)在调用优化器时将参数规范化在 0 和 1 之间,并在调用外部模拟器之前将它们去规范化。