Scipy basinhopping不尊重步骤?

时间:2016-04-21 23:28:36

标签: python optimization scipy

运行以下代码,在第7次打印出被评估的参数(x)时,参数从大约100跳到.01,尽管初始步长设置为.1且间隔设置为50。是否能够使跳跃超过步长的跳跃如此大?

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)

1 个答案:

答案 0 :(得分:4)

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

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

在您的示例中,默认的局部最小化器(我认为是BFGS)在第一次迭代时找到全局最小值。局部最小化器使用7个函数求值来做到这一点,但它仍然在一个流域迭代中。盆地购物并不知道它处于全球最低点,所以它继续试图找到一个更好的。