scipy Nelder-Mead单纯形优化

t8e9dugd  于 2023-03-18  发布在  其他
关注(0)|答案(3)|浏览(143)

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

hof1towb

hof1towb1#

对Nelder-Mead的两点建议:
1)将所有x对齐到函数内部的网格,比如.01:

x = np.round( x / grid ) * grid
f = ...

这在高维中充当简单的噪声过滤器(在2d或3d中,不用麻烦)。
2)从2d+1个邻近点中最好的d+1个开始,而不是通常的d+1:

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之后的neard 1()值也是个不错的主意,可以了解func()在那里的样子。
如果任何邻居比N-M个“最佳”更好,则从新的单纯形重新开始N-M。(可以交替neard 1,N-M,neard 1,N-M:简单但非常依赖于问题。)
你有多少个变量,你的函数有多嘈杂?
希望这能帮上忙

xpcnnkqh

xpcnnkqh2#

根据http://docs.scipy.org/doc/处的参考:
方法Nelder-Mead使用单纯形算法[R123],[R124]。该算法在许多应用中取得了成功,但使用一阶和/或二阶导数信息的其他算法可能更好,因为它们通常具有更好的性能和鲁棒性。
因此,建议使用完全不同的算法。注意:
方法BFGS使用Broyden、弗莱彻、Goldfarb和Shanno(BFGS)[R127]第136页的准牛顿法。它仅使用一阶导数。BFGS已被证明即使对于非平滑优化也具有良好的性能。此方法还返回Hessian逆的近似值,存储为OptimizeResult对象中的hess_inv。
BFGS听起来更健壮,整体速度更快。
肺动脉高压RG

mwngjboj

mwngjboj3#

添加一个更当前的答案以防有人遇到这个问题。scipy.optimize.minimize()的最新实现允许你传入一个初始单纯形作为参数。查看文档了解细节。我发现它非常有帮助,因为我也遇到过默认初始单纯形太小的问题。

相关问题