【问题标题】:Python Scipy Optimization method: global optimization failedPython Scipy优化方法:全局优化失败
【发布时间】:2017-07-26 21:09:19
【问题描述】:

我正在尝试使用 Scipy 全局优化器来查找函数的全局最小值,但它没有给出全局最小值作为答案,而是停留在局部最小值中。 代码:

def f(x):
    return x**2 + 10*np.sin(x)
x = np.arange(-10, 10, 0.1)
print(optimize.basinhopping(f, 3))

谁能告诉我为什么?您认为 Scipy 中哪种方法是解决全局优化的最佳方法?

【问题讨论】:

  • 默认stepsize 为0.5。它没有采取足够大的步骤来逃离盆地。
  • 如果您不知道局部最小值有多宽,请在优化的基础上应用模拟退火。

标签: python numpy optimization


【解决方案1】:

只有 SHGO 会为您提供保证。基于我的benchmarking exercise,它也有更好的性能。 Basin-hopping 可能会在一个可能的局部最小值上花费太多时间,而基于同源性的技术(即 shgo,如果你愿意,你也可以 pip install 和单独使用 scipy)以一种巧妙的方式避免了这种情况。

我要补充一点,如果你真的要小心,你应该改变默认的 SHGO 采样(它会默认使用 Sobol,这在技术上违反了保证)。

【讨论】:

    【解决方案2】:

    简单的scipy.optimize 正在为您的问题找到全局最小值。运行以下代码:

    import math
    import numpy as np
    from scipy.optimize import minimize
    
    def objective(x):
        # min f(x)
        return x[0]**2+10*math.sin(x[0])
    
    if __name__ == "__main__":
        # initial guesses
        n = 1
        x0 = np.zeros(n)
        x0[0] = 90.0
    
        # show initial objective
        print('\nInitial Objective: ' + str(objective(x0)))
    
        # state bounds
        b1 = (-100.0, 100.0)
        bds = (b1,)
        print("\n")
        solution = minimize(objective, x0, method='SLSQP', jac=None, bounds=bds,
                            tol = 1e-20, constraints=(),
                            options={'maxiter': 1000000, 'ftol': 1e-20, 'disp': True})
        
        # z is a numpy.ndarray vector
        z = solution.x
    
        # show final objective
        print('\nFinal Objective')
        print('f* = ' + str(objective(z)))
    
        # print solution
        print('\nSolution')
        print('x1* = ' + str(z[0]))
    

    哪个输出:

    Initial Objective: 10005.063656411097
    
    
    Optimization terminated successfully.    (Exit mode 0)
                Current function value: -7.9458233756152845
                Iterations: 7
                Function evaluations: 34
                Gradient evaluations: 7
    
    Final Objective
    f* = -7.9458233756152845
    
    Solution
    x1* = -1.3064400096083357
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-05
      • 2020-05-01
      • 2017-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-27
      • 2020-08-25
      相关资源
      最近更新 更多