我有一个函数f(x,k1,k2),我试图将它最小化为 2d 网格上的x不同值,(k1,k2)就像这样
for i,k1 in enumerate(np.logspace(-3.3,-1,20)):
for j,k2 in enumerate(np.logspace(-3.3,-1,20)):
if j==0:
initial_guess = best_x_0
else:
initial_guess = best_x
res = minimize(f,initial_guess,args=(k1,k2),bounds=((0.001,1),),tol=0.01,method='L-BFGS-B')
因为(k1,k2)这是一个 1d 问题,并且该函数的表现相对较好,只有 1 个最小值。但是,评估它的成本非常高,根据参数的不同,从几秒钟到大约 10 分钟不等。显然,必须有一种比将其视为许多独立的最小化问题更有效的方法来解决这个问题。如果这些点(k1,k2)足够接近,并且我已经有一个点的最小值,那么它周围的点的最小值应该不会有很大不同。
我查看了 Scipy 提供的功能,但没有找到适合此目的的任何东西。
中的函数scipy.optimize.minimize_scalar不需要初始猜测,所以我不知道如何利用 2d 网格结构。
我也遇到了'L-BFGS-B'使用scipy.optimize.minimize. 例如,使用k1=k2=0.000501187233627和它的初始猜测在 8 个函数评估中x=0.02收敛。x=0.022114610909但是,如果我使用与 相同的初始猜测k1=k2= np.logspace(-3.3,-1,20)[0] = 0.000501187233627272527534957103,那么当显然不应该有任何差异时,它会卡在x=0.01999926424执行无用的评估上,例如x=0.019966155,0.01999995105,0.0199951834.
实现这一目标的最佳方法是什么?