Критерий остановки для Nelder Mead

11

Я пытаюсь реализовать алгоритм Nelder-Mead для оптимизации функции. Страница Википедии о Nelder-Mead удивительно ясна обо всем алгоритме, за исключением критерия его остановки. Там это печально говорит:

Проверьте сходимость [требуется уточнение] .

Я попробовал и протестировал пару критериев сам:

  • Стоп , если , где ε мала и где х я это я -я вершина симплекса, заказал у минимума ( е ( х 1 ) ) до высокой ( F ( х N + 1 )f(xN+1)f(x1)<ϵϵxiif(x1)f(xN+1)) значения функции. Другими словами, когда максимальное значение симплекса почти равно минимальному значению. Я обнаружил, что это не работает должным образом, так как это не дает никаких гарантий относительно того, что функция делает внутри симплекса. В качестве примера рассмотрим функцию: Это, конечно, тривиальная задача для оптимизации, но давайте скажем, что мы делаем это с NM, и пусть наши две симплексные точки будут x 1 = - 1 и x 2 = 1 . Алгоритм будет сходиться здесь, не находя своего оптимума.

    f(x)=x2
    x1=1x2=1
  • Второй вариант предполагает оценку центроида симплекса: остановите, если . Это предполагает, что если нижняя точка симплекса и центроида имеют такие сходные значения, симплекс достаточно мал, чтобы вызвать сходимость.|f(x1)f(xc)|<ϵ

Это правильный способ проверки на сходимость? Или есть проверенный способ проверить это? Я не смог найти никаких источников по этому поводу, так как большинство поисковых хитов фокусируется на сложности алгоритма.

JAD
источник
xN+1x1xN
3
Лучший критерий остановки для Nelder Mead - это прежде чем вы начнете.
Марк Л. Стоун
NN+1
@NatePope Это было мое намерение, да, я добавлю разъяснения к вопросу. \
JAD

Ответы:

6

Изложение этого «алгоритма нисходящего симплекса» в оригинальных версиях Numeric Recipes особенно понятно и полезно. Поэтому я процитирую соответствующие части этого. Вот фон:

NN

N+1P0

(10.4.1)Pi=P0+λei
eiNλ

Большинство шагов просто [перемещают] точку симплекса, где функция является наибольшей («наивысшая точка») через противоположную грань симплекса, в нижнюю точку. ...

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

Критерии прекращения могут быть деликатными ... Обычно мы можем определить один «цикл» или «шаг» нашего многомерного алгоритма. Затем можно завершить, когда векторное расстояние, перемещаемое на этом шаге, будет немного меньше по величине, чем некоторый допуск TOL. В качестве альтернативы, мы могли бы потребовать, чтобы уменьшение значения функции на шаге завершения было немного меньше некоторого допуска FTOL. ...

NN+1(10.4.1)P0

Перезапуск никогда не должен быть очень дорогим; Ваш алгоритм, в конце концов, сходился к точке перезапуска один раз, и теперь вы запускаете алгоритм уже там.

[Страницы 290-292.]

xyT>0

(1)|x||y|f(x,y)=2|x||y||x|+|y|<T

f(x,y)=(|x|+|y|)/2

(1)

Ссылка

Уильям Х. Пресс и соавт. , Численные Рецепты: Искусство Научного Вычисления. Издательство Кембриджского университета (1986). Посетите http://numeric.recipes/ для последних выпусков.

Whuber
источник
1
Спасибо за понимание о перезапуске. Я думал, что это просто запуск алгоритма из разных начальных точек, но на самом деле, похоже, есть кое-что еще.
JAD
Раньше я не думал о возможных значениях «перезагрузки». В данном контексте я мог бы использовать термин «полировка» для «перезапуска», но, возможно, это не совсем верно. Тип «перезапуска», рекомендуемый для симплекс-метода, может быть довольно особенным для него.
whuber
9

Не полный ответ, но слишком длинный для комментария и может поставить вас на правильный путь.

Эта тема кратко рассматривается на странице 171 "Компактные численные методы для компьютеров" 2-е издание, Джон С. Нэш. И, как оказалось, это ссылка, процитированная для подпрограммы Nelder-Mead, реализованной в optim()функции R. Цитирую соответствующую часть:

test=[(i=1n+1[S(bi)S¯]2)/n]1/2
S¯=i=1n+1S(bi)/(n+1).

S(.)bn+1nbHbL

S(bL)S(bH)

Беглый взгляд на источник optim()показывает, что он использует разницу между самым высоким и самым низким значениями функций (точек, определяющих симплекс), чтобы определить сходимость: if (VH <= VL + convtol || VL <= abstol) break;где VHнаходится высокое значение и VLнизкое значение. Это связано с предупреждением, что я очень быстро взглянул на источник и, возможно, что-то упустил.

Теперь ваш вариант (1) представляется вторым подходом, отстаиваемым Нэшем. Он также обсуждает проблему, с которой вы столкнулись:

(n+1)(n1)n

Оригинальные ссылки, на которые ссылается Нэш здесь:

Нелдер Дж. А., Мид Р. 1965. Симплексный метод минимизации функций. Компьютерный журнал 7: 308-313.

О'Нил Р. 1971. Алгоритм А.С. 47: Минимизация функций с помощью симплексной процедуры. Прикладная статистика 20: 338-345.

Нейт Папа
источник
3

fmin(t)minall corners f(Xi,t)
# stop when you run out of patience, no improvement for say 10 iterations in a row:
if t > tbest + patience:
    message = "iter %d: f %g >= fbest %g" ...
    return message, fbest, xbest

n+1

  1. проблема: пересеченная местность, возможно, с плохим масштабированием или глупыми ограничениями
  2. алгоритм, балансирующий исследование и перемещение (и сложность программного обеспечения)
  3. собственно правило остановки

еще предстоит выяснить - реальные тестовые случаи приветствуются.

(Реальный Stopiterкласс имеет много условий остановки, в дополнение к patience; самое простое - время настенных часов.)

Смотрите также:
NLopt : множество алгоритмов, включая Nelder-Mead, их легко сравнивать. В особенности обратите внимание на примечания по сравнению алгоритмов
Downhill : терпение останавливается сmin_improvement

Денис
источник