首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scipy optimize - fmin Nelder Mead simplex

scipy optimize - fmin Nelder Mead simplex
EN

Stack Overflow用户
提问于 2012-03-20 22:04:54
回答 2查看 4.3K关注 0票数 2

我正在尝试使用scipy Nelder-Mead单纯形搜索函数来找到一个非线性函数的最小值。我的单纯形似乎被卡住了,因为它从太小的初始单纯形开始。不幸的是,我在scipy中看不到任何地方可以更改一些单形参数(例如初始单形大小)。有什么办法吗?我是不是遗漏了什么?还有没有其他的NM单工实现?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2012-03-27 22:49:21

给内尔德-米德的两个建议:

1)在函数内部将所有x捕捉到一个网格,比如.01:

代码语言:javascript
复制
x = np.round( x / grid ) * grid
f = ...

这就像一个高维的简单噪声过滤器(在2d或3d中,不用费心了)。

2)从2d+1附近点的最佳d+1开始,而不是通常的d+1:

代码语言:javascript
复制
def neard1( func, x, h, verbose=1 ):
    """ eval func at 2d+1 points x, x +- h
        sort
        -> f[ d+1 best values ],  X[ d+1 ] 
        to start or restart Nelder-Mead
    """
    dim = len(x)
    I = np.eye(dim)
    np.fill_diagonal( I, h )  # scalar or vec
    X = x + np.vstack(( np.zeros(dim), I, - I ))
    fnear = np.array([ func( x ) for x in X ])  # 2d+1
    f0 = fnear[0]
    up = np.argsort( fnear )  # vec func: |fnear|
    if verbose:
        print "neard1: f %g +- %s  around x %s" % ( 
            f0, fnear[up] - f0, x )
    bestd1 = up[:dim+1]
    return fnear[bestd1], X[bestd1]

看一看Nelder-Mead之后的func()值也不是个坏主意,以了解neard1()在那里是什么样子。

如果有任何邻居比N-M“最好”,则从新的单形重新启动N-M。(可以替换neard1、N-M、neard1、N-M:很简单,但非常依赖于问题。)

你有多少个变量,你的函数有多嘈杂?

希望这能有所帮助

票数 2
EN

Stack Overflow用户

发布于 2012-03-20 22:28:55

来自http://docs.scipy.org/doc/的参考资料

方法内德-米德使用单纯形算法R123,R124。该算法已经在许多应用中取得了成功,但通常情况下,使用一阶和/或二阶导数信息的其他算法可能会因为其更好的性能和鲁棒性而被首选。

然后,建议使用完全不同的算法。请注意:

方法BFGS使用Broyden,Fletcher,Goldfarb和Shanno (BFGS)的准牛顿方法R127第136页。它只使用一阶导数。BFGS已被证明具有良好的性能,即使对于非平滑优化也是如此。此方法还返回海森逆的近似值,存储为OptimizeResult对象中的hess_inv。

总的来说,BFGS听起来更健壮,速度更快。

ParagonRG

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9788378

复制
相关文章

相似问题

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