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

谢谢

最佳答案

对于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之后看一下neard1()值也不是坏主意,
了解一下func()的外观。
如果有邻居比N-M更好,则从该新单纯形重新启动N-M。
(可以交替使用neard1,N-M,neard1,N-M:简单但非常依赖问题。)

您有多少个变量,您的函数有多吵?

希望这可以帮助

关于python - scipy优化-fmin Nelder-Mead单纯形,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9788378/

10-11 20:30