我正在使用scipy的Basin Hopping algorithm来优化多变量成本函数。温度是极大地影响盆地跳跃算法收敛时间的参数之一。我希望能够通过将成本函数值曲线拟合到当前迭代并确定它是否比先前的温度设置更快收敛来确定basinhopping()
收敛的速度。
这是盆地跳跃呼叫的样子:
res = basinhopping(cost, guess, niter=1, T=t, minimizer_kwargs={"method": "cobyla"})
是否有某种方法可以对成本函数的当前值进行“实时”更新,以便我可以进行自适应优化?
答案 0 :(得分:1)
我并非100%确定我理解您的问题,但是购物盆参数callback
听起来就像您正在寻找的那样。
在旁注中,您尝试做的事情听起来与本文的概念有点相似Freeze-Thaw Bayesian Optimization
答案 1 :(得分:1)
你想找到一个最佳的T, 通过例如 Golden_section_search 关于一个变量的功能:
ftemperature( T ) = basinhopping( ... T=T ... ) .func ?
如果是,请构建func
T
和res
的历史记录列表,以便为Tsearch
功能提供信息:
# initialize history lists for a few T (grid search) --
fhist, Thist, reshist = [], [], []
for T in [...]:
res = basinhopping( cost, guess, T=T ... )
print "T %.3g func %.3g" % (T, res.func)
fhist.append( res.func )
Thist.append( T )
reshist.append( res )
# search for new T --
while True:
T = Tsearch( Thist, fhist ) # golden search or ...
if T is None: break
res = basinhopping( cost, guess, T=T ... )
print "T %.3g func %.3g" % (T, res.func)
fhist.append( res.func )
Thist.append( T )
reshist.append( res )
如果没有,请澄清。
(你可以在callback
内做同样的事情,正如@Jacob Stevenson所说。)
(有一些更简单的方法可以最小化一个变量的功能,参见例如 scipy.optimize.minimize_scalar 。)