首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scipy.optimize被困在局部极小值。我能做什么?

scipy.optimize被困在局部极小值。我能做什么?
EN

Stack Overflow用户
提问于 2018-09-21 07:01:06
回答 2查看 6.4K关注 0票数 3
代码语言:javascript
复制
 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 B,TNC和SLSQP。这就是我到目前为止一直在看的线程:Scipy.optimize: how to restrict argument values

我怎么才能解决这个问题?

我正在使用Spyder(Python3.6)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-21 07:33:46

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

共同的解决办法是:

  • 在边界内有随机起点的循环中使用优化。 从numpy导入*;从scipy.optimize导入*;从数学导入导入* def (X):x=X;y=X1返回i(100)的x**4-3.5*x*3-2*x*2+12*x+y*2-2*y bnds =(1,3),(0,2):x_init = np.random.uniform(low=bnds,high=bnds) y_init = np.random.uniform(low=bnds1,high=bnds1) min_test = minimize(f,x_init,y_init,界= bnds)打印(min_test.x,min_test.fun)
  • 使用一种可以突破局部极小值的算法,我可以推荐can的basinhopping()
  • 使用全局优化算法,并将其结果作为局部算法的初始值。推荐是NLopt的DIRECT或MADS算法(例如NOMAD)。还有一个是我还没试过的,shgo
票数 11
EN

Stack Overflow用户

发布于 2019-09-17 07:52:33

试试scipy.optimize.basinhopping。它只需多次重复最小化过程,得到多个局部极小值。最小值是全局最小值。

代码语言:javascript
复制
minimizer_kwargs = {"method": "L-BFGS-B"}
res=optimize.basinhopping(nethedge,guess,niter=100,minimizer_kwargs=minimizer_kwargs)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52438263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档