scipy optimize - fmin Nelder-Mead simplex - PullRequest
       17

scipy optimize - fmin Nelder-Mead simplex

2 голосов
/ 20 марта 2012

Я пытаюсь использовать сиппи-функцию симплексного поиска Нелдера-Мида, чтобы найти минимум нелинейной функции. Кажется, мой симплекс застревает, потому что он начинается с начального симплекса, который слишком мал. К сожалению, я не вижу нигде в scipy, где вы можете изменить некоторые параметры симплекса (например, начальный размер симплекса). Есть ли способ? Я что-то пропустил? Или есть другие реализации симплекса NM?

Спасибо

Ответы [ 2 ]

2 голосов
/ 27 марта 2012

Два предложения для Nelder-Mead:

1) привязать все x к сетке, скажем 0,01, внутри функции:

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

Это действует как простой шумФильтр больших размеров (в 2d или 3d, не беспокойтесь).

2) начинайте с лучших d + 1 из 2d + 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]

Также неплохо бы посмотреть на значения neard1 () после Nelder-Mead, чтобы понять, как там выглядит func ().
Если какие-то соседи лучше, чем NM "лучше всего, перезапустите NM с этого нового симплекса.(Можно чередовать neard1, NM, neard1, NM: легко, но очень проблемно-зависимо.)

Сколько у вас переменных и насколько шумна ваша функция?

Надеюсь, это поможет

1 голос
/ 20 марта 2012

Из ссылки на http://docs.scipy.org/doc/:

Метод Nelder-Mead использует симплексный алгоритм [R123], [R124]. Этот алгоритм был успешным во многих приложениях, но другие алгоритмы, использующие первую и / или вторую производную информацию, могут быть предпочтительнее из-за их лучших характеристик и надежности в целом.

Тогда может быть рекомендовано использовать совершенно другой алгоритм. Обратите внимание, что:

Метод BFGS использует квазиньютоновский метод Бройдена, Флетчера, Голдфарба и Шенно (BFGS) [R127], с. 136. Он использует только первые производные. BFGS доказал хорошую производительность даже для негладких оптимизаций. Этот метод также возвращает аппроксимацию обратного гессиана, сохраненную как hess_inv в объекте OptimizeResult.

BFGS звучит более надежно и быстрее.

ParagonRG

...