【问题标题】:scipy.optimize get's trapped in local minima. What can I do?scipy.optimize 陷入局部最小值。我能做些什么?
【发布时间】:2019-02-25 12:59:09
【问题描述】:
 from numpy import *; from scipy.optimize import *; from math import *
def f(X):
    x=X[0];    y=X[1]
    return x**4-3.5*x**3-2*x**2+12*x+y**2-2*y

bnds = ((1,5), (0, 2))
min_test = minimize(f,[1,0.1], bounds = bnds); 
print(min_test.x)

我的函数f(X)x=2.557, y=1 有一个局部最小值,我应该可以找到它。

上面显示的代码只会在x=1 处给出结果。我尝试了不同的公差和三种方法:L-BFGS-B、TNC 和 SLSQP。 这是我到目前为止一直在看的线程: Scipy.optimize: how to restrict argument values

我该如何解决这个问题?

我正在使用 Spyder(Python 3.6)。

【问题讨论】:

  • print(f([2557, 1])) = 42690172880760.5,我不会将其称为本地最小值...
  • f([1, 1]) = 6.5
  • 对不起,我的意思是 2.557。我已经编辑了
  • 尝试使用global optimization 方法。 SciPy 提供some of them

标签: python scipy spyder minimization


【解决方案1】:

您刚刚遇到了局部优化的问题:它在很大程度上取决于您传入的开始(初始)值。如果您提供[2, 1],它将找到正确的最小值。

常见的解决方案有:

  • 在边界内随机起点的循环中使用您的优化

    import numpy as np
    from numpy import *; from scipy.optimize import *; from math import *
    
    def f(X):
        x=X[0];    y=X[1]
        return x**4-3.5*x**3-2*x**2+12*x+y**2-2*y
    
    bnds = ((1,3), (0, 2))
    
    for i in range(100):
    
        x_init = np.random.uniform(low=bnds[0][0], high=bnds[0][1])
        y_init = np.random.uniform(low=bnds[1][0], high=bnds[1][1])
    
        min_test = minimize(f,[x_init, y_init], bounds = bnds)
    
        print(min_test.x, min_test.fun)
    
  • 使用可以突破局部最小值的算法,我可以推荐scipy的basinhopping()

  • 使用全局优化算法并将其结果用作局部算法的初始值。建议使用 NLopt 的 DIRECT 或 MADS 算法(例如 NOMAD)。 scipy中还有一个,shgo,我还没试过。

【讨论】:

  • 谢谢。当函数变得冗长而复杂时,我实际上对 scipy.minimize 有很多问题。你能推荐替代品吗?
  • 长而复杂是什么意思?还有一些其他优化模块,例如nlopt。但他们都会使用你冗长而复杂的函数。最后,scipy 中可用的方法可以很好地解决各种各样的问题。
【解决方案2】:

试试scipy.optimize.basinhopping。它只是多次重复您的最小化过程并获得多个局部最小值。最小值是全局最小值。

minimizer_kwargs = {"method": "L-BFGS-B"}
res=optimize.basinhopping(nethedge,guess,niter=100,minimizer_kwargs=minimizer_kwargs)

【讨论】:

    猜你喜欢
    • 2019-01-15
    • 2020-12-30
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多