Python scipy优化中的步长最小化

Python scipy优化中的步长最小化,python,optimization,scipy,minimize,Python,Optimization,Scipy,Minimize,我通过改变3个参数来运行模拟。对于每个模拟,我计算一个指数,告诉我模拟是否在改善(较低的指数)。 为此,我使用了scipy.optimize.minimize,但我不确定哪种方法最好(我正在尝试了解更多) def启动器(x0): #可变参数# 变化的_p(x0[0],x0[1],x0[2]) 运行模拟(模拟) 结果=导入结果(模拟) 索引=索引计算(数据来源、数据目的、模拟、结果) 值=索引['CHI_tot'].iloc[-1] 返回值 每个参数在我用“界限”表示的范围内变化 当我启动模拟时

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

def启动器(x0):
#可变参数#
变化的_p(x0[0],x0[1],x0[2])
运行模拟(模拟)
结果=导入结果(模拟)
索引=索引计算(数据来源、数据目的、模拟、结果)
值=索引['CHI_tot'].iloc[-1]
返回值
每个参数在我用“界限”表示的范围内变化

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

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

v_cp=999.209
v_ρ=1249.94
v_λ=0.2815
initialcond=np.数组([v_cp,v_rho,v_lambda])
#界限:仅对方法L-BFGS-B、TNC、SLSQP、Powell和trust constr有效
界限=[(4001600),(4001600),(0.1,1.2)]
res=minimize(启动器,initialcond,bounds=bounds,method='L-BFGS-B',options={'maxiter':10})
打印(res.x)

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

  • 我似乎记得有些优化器允许您为梯度计算设置步长(“eps”参数)

  • (更好)在调用优化器时将参数规格化为0到1之间,并在调用外部模拟器之前将其反规格化


  • 欢迎至少对我来说,如果你能制定出更多你想要实现的目标,这将是很有帮助的。首先,我想知道你的
    启动器是否真的是一个平滑函数(这是基于梯度的
    L-BFGS-B
    的先决条件)。此外,参数空间中的步长由非常成熟的基础数学给出;我怀疑你可以通过手动步长控制来加快速度。您对
    L-BFGS-B
    了解多少?您希望控制什么?感谢您及时回复。不幸的是,我对L-BFGS-B知之甚少,我希望了解更多。该函数调用一个仿真软件,该软件反过来启动一个仿真。所得数据与实验数据进行了比较。在python中,我总是计算一个统计指数,告诉我是否接近实际测量数据。所以我不知道在这种情况下如何使用平滑函数。我已尝试打印尝试优化器的所有尝试(839.844919951963)。也许我应该改变方法类型?请注意,该算法通过有限差分近似梯度。这可能是您看到的小步长,最好使用无导数(DFO)方法。