肮脏的流浪汉不尊重步长?

Pet*_*ter 5 python optimization scipy

运行以下代码,在要评估的参数(x)的第7个输出中,尽管将初始步长设置为.1并将间隔设置为50,但是参数仍从约100跳至.01。跳得比步幅大这么大?

import multiprocessing as mp
from scipy.optimize import basinhopping

def runEnvironment(x):
    return x**2

def func(x):
    print "x:",x
    pool = mp.Pool(processes=1)

    results=pool.apply(runEnvironment,(x,))
    pool.close()
    return results


if __name__ == '__main__':
    x0=100    
    ret=basinhopping(func, x0, niter=100, T=1.0, stepsize=.1, minimizer_kwargs=None, take_step=None, accept_test=None, callback=None, interval=50, disp=False, niter_success=None)
Run Code Online (Sandbox Code Playgroud)

小智 4

盆地跳跃是一个迭代过程,它使用局部最小化,然后在坐标空间中迈出一步(步长),然后再次进行局部最小化,希望达到不同的最小值。

步骤大小参数仅适用于坐标空间中的步骤。

在您的示例中,默认局部最小化器(我认为是 BFGS)在第一次迭代时找到全局最小值。局部最小化器使用 7 个函数评估来完成此操作,但它仍在一次盆地跳跃迭代内。Basinhopping 并不知道自己处于全局最小值,因此它会继续尝试寻找更好的值。