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)为你计算一个数值。这可能就是你所看到的。一些“解决方法”:
我好像记得有些优化器允许你设置梯度计算的步长(“eps”参数)
(更好)在调用优化器时将参数规范化在 0 和 1 之间,并在调用外部模拟器之前将它们去规范化。
我正在 运行 通过改变 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)为你计算一个数值。这可能就是你所看到的。一些“解决方法”:
我好像记得有些优化器允许你设置梯度计算的步长(“eps”参数)
(更好)在调用优化器时将参数规范化在 0 和 1 之间,并在调用外部模拟器之前将它们去规范化。