Начальный размер симплекса Нелдера-Мида

Я использую функцию Matlab fminsearch для нахождения минимума с помощью Nelder-Mead. fminsearch автоматически вычисляет размер исходного симплекса. В моем случае исходный симплекс слишком мал, поэтому работает плохо.

fminsearch использует ветвь длиной 5% от размера каждой переменной со значением 0,00025 для нулевых переменных. Однако я прочитал следующий (источник):

Однако может быть разумным установить точки таким образом, чтобы симплекс покрывал практически весь возможный диапазон. Алгоритм Нелдера-Мида автоматически сократит симплекс и приблизит его к оптимуму. Практическое преимущество этой политики заключается в том, что вы получите более полное представление о функции отклика.

Какую длину ноги (в процентах) я должен выбрать, чтобы принять эту политику?

Пожалуйста, помните, что первая симплекс-операция всегда является отражением. Если исходный симплекс покрывает весь разрешенный диапазон, то отражение обязательно даст точку за пределами. Но HillStormer позволяет использовать линейные ограничения и позволяет избежать этой проблемы.

Какие линейные ограничения я должен использовать, чтобы избежать этой проблемы? Я использую fminsearchbnd и fminsearchcon, которые допускают такие ограничения.

И последнее, но не менее важное: я прочитал в Numerical Recipes, что когда алгоритм застревает на локальном минимуме, помогает повторная инициализация симплекса в той точке, где вы застряли. Конечно, если fminsearch прекратит работу, я смогу запустить его снова, используя новые точки в качестве отправных точек. Какое значение я должен установить начальный размер симплекса в этом случае?


person machinery    schedule 23.05.2016    source источник
comment
Похоже, что функция fminsearchbnd делает для вас ограничение. Кажется, это довольно хорошая функция для этой проблемы. Просто укажите границы этой функции, и если какое-либо значение параметра выйдет за пределы границы, оно будет ограничено этой границей. Размер ноги можно установить, внеся изменения в сам файл fminsearch.m. Я настоятельно рекомендую не изменять сам файл, а сделать его копию для ваших нужд. В файле вы можете увидеть строки, содержащие usual_delta = 0.05; и zero_term_delta = 0.00025;. Они представляют собой процент переменных. Попробуйте увеличить значения и сообщите!   -  person Erik    schedule 24.05.2016
comment
@Эрик Спасибо за ответ. Если я поставлю usual_delta = 1, будет ли исходный симплекс покрывать практически весь возможный диапазон? Почему дельта нулевого члена такая маленькая?   -  person machinery    schedule 24.05.2016
comment
1 = 100%, значит исходный симплекс будет иметь ноги размером с переменные. Границы, которые вы хотите установить для этих переменных, могут быть разными, например. если x — ваша переменная, а x0 = 1 — исходное предположение, а дельта — 1, симплекс будет начинаться с участков размером 1 вокруг x, поэтому 0 и 2 (поправьте меня, если я ошибаюсь). Если ваша граница, например, ‹=5, то ваша дельта может быть установлена ​​больше. Если нужная вам граница была 1,2, то дельта должна быть меньше. Сначала определите свою границу, затем определите x0, затем нужные дельты.   -  person Erik    schedule 24.05.2016
comment
Я не знаю, почему zero_term_delta маленький. Вероятно, он настолько мал, потому что пользователь дает начальное предположение, равное нулю, поэтому, возможно, оптимум может быть найден при нуле. Если алгоритму разрешено делать большие шаги от нуля, он может найти локальный оптимум вместо глобального оптимума, и, возможно, вычислительные затраты также возрастут.   -  person Erik    schedule 24.05.2016
comment
@Эрик Еще раз спасибо. Связан ли процент (для ветвей) с первоначальным предположением этой переменной, а не с диапазоном? Я предположил, что это связано с диапазоном, поэтому установка дельты на 1 (100%) означает, что охвачен весь диапазон.   -  person machinery    schedule 24.05.2016
comment
@Erik Я знаю границы, например, для параметра x это [-5, 15], а для параметра y это [0, 1]. Начальные догадки x0 и y0 я определяю путем случайной выборки в интервале, поэтому, допустим, x0 = -3 и y0 = 0,2. Как рассчитать дельту для каждой переменной, чтобы она охватывала весь диапазон? Поскольку я делаю случайную выборку для первоначального предположения, мне нужен несколько автоматический способ.   -  person machinery    schedule 24.05.2016
comment
Вы можете попытаться сделать дельту очень большой, что позволит исходному симплексу охватить все пространство параметров. Я надеюсь, что ограниченная симплексная функция fminsearchbnd просто заставит ноги быть не больше границ. Однако тогда у вас никогда не будет случайной инициализации, потому что каждый начальный симплекс будет одинаковым (охватывающим все пространство параметров), и найденный оптимум тоже всегда будет одним и тем же: он может не быть глобальным оптимумом.   -  person Erik    schedule 25.05.2016
comment
Понятно, понятно... у вас есть другая эвристика для выбора дельты?   -  person machinery    schedule 26.05.2016