Я использую функцию Matlab fminsearch для нахождения минимума с помощью Nelder-Mead. fminsearch автоматически вычисляет размер исходного симплекса. В моем случае исходный симплекс слишком мал, поэтому работает плохо.
fminsearch использует ветвь длиной 5% от размера каждой переменной со значением 0,00025 для нулевых переменных. Однако я прочитал следующий (источник):
Однако может быть разумным установить точки таким образом, чтобы симплекс покрывал практически весь возможный диапазон. Алгоритм Нелдера-Мида автоматически сократит симплекс и приблизит его к оптимуму. Практическое преимущество этой политики заключается в том, что вы получите более полное представление о функции отклика.
Какую длину ноги (в процентах) я должен выбрать, чтобы принять эту политику?
Пожалуйста, помните, что первая симплекс-операция всегда является отражением. Если исходный симплекс покрывает весь разрешенный диапазон, то отражение обязательно даст точку за пределами. Но HillStormer позволяет использовать линейные ограничения и позволяет избежать этой проблемы.
Какие линейные ограничения я должен использовать, чтобы избежать этой проблемы? Я использую fminsearchbnd и fminsearchcon, которые допускают такие ограничения.
И последнее, но не менее важное: я прочитал в Numerical Recipes, что когда алгоритм застревает на локальном минимуме, помогает повторная инициализация симплекса в той точке, где вы застряли. Конечно, если fminsearch прекратит работу, я смогу запустить его снова, используя новые точки в качестве отправных точек. Какое значение я должен установить начальный размер симплекса в этом случае?
fminsearchbnd
делает для вас ограничение. Кажется, это довольно хорошая функция для этой проблемы. Просто укажите границы этой функции, и если какое-либо значение параметра выйдет за пределы границы, оно будет ограничено этой границей. Размер ноги можно установить, внеся изменения в сам файлfminsearch.m
. Я настоятельно рекомендую не изменять сам файл, а сделать его копию для ваших нужд. В файле вы можете увидеть строки, содержащиеusual_delta = 0.05;
иzero_term_delta = 0.00025;
. Они представляют собой процент переменных. Попробуйте увеличить значения и сообщите! - person Erik   schedule 24.05.2016usual_delta = 1
, будет ли исходный симплекс покрывать практически весь возможный диапазон? Почему дельта нулевого члена такая маленькая? - person machinery   schedule 24.05.2016zero_term_delta
маленький. Вероятно, он настолько мал, потому что пользователь дает начальное предположение, равное нулю, поэтому, возможно, оптимум может быть найден при нуле. Если алгоритму разрешено делать большие шаги от нуля, он может найти локальный оптимум вместо глобального оптимума, и, возможно, вычислительные затраты также возрастут. - person Erik   schedule 24.05.2016fminsearchbnd
просто заставит ноги быть не больше границ. Однако тогда у вас никогда не будет случайной инициализации, потому что каждый начальный симплекс будет одинаковым (охватывающим все пространство параметров), и найденный оптимум тоже всегда будет одним и тем же: он может не быть глобальным оптимумом. - person Erik   schedule 25.05.2016