Мне нужно найти минимум функции. Читая документы по адресу http://docs.scipy.org/doc/scipy/reference/optimize.html, я вижу, что есть несколько алгоритмов, которые делают одно и то же, то есть находят минимум. Как я узнаю, какой из них выбрать?
некоторые из перечисленных алгоритмов
- Минимизируйте функцию, используя алгоритм симплексного спуска.
- Минимизируйте функцию, используя алгоритм BFGS.
- Минимизируйте функцию с помощью алгоритма нелинейного сопряженного градиента.
- Минимизируйте функцию f, используя метод Ньютона-CG.
- Минимизируйте функцию, используя модифицированный метод Пауэлла.
Моя функция линейная. размерность составляет около 232750 (это то, сколько разных градиентов мне приходится вычислять каждый раз), для вычисления градиента и стоимости один раз требуется около 2 минут, так что это не дешево. Я не думаю, что у меня есть ограничения. оно детерминированное и непрерывное.
optimization
siamii
источник
источник
Ответы:
Исходя из того, что вы сказали: я предполагаю, что вы должны оптимизировать для 50 переменных; Я также предполагаю, что у вас возникла ситуация, когда очень сложно найти аналитические производные (не говоря уже о том, чтобы получить числовые значения), и что ваша оптимизация не ограничена.
Позвольте мне подчеркнуть, что вы немного несчастливы, потому что между 25-30 и 100 переменными это немного сумеречная зона, когда дело доходит до выбора между процедурами оптимизации большого или малого масштаба. Тем не менее, ничего не потеряно.
Учитывая, что даже производные первого порядка дороги, чтобы получить такой вид убивает идею метода Ньютона. Возможно, вам повезет с Quasi-Newton (BFGS), хотя если ваш гессиан немного диагонали, как начать с. CG обычно немного медленнее, чем BFGS, так что, вероятно, это не сильно улучшит ситуацию; используйте его, если память также является проблемой (или просто используйте L-BFGS в этом случае). Кроме того, учитывая, насколько медленно вы оцениваете вашу функцию, простой алгоритм поиска по крутому спуску / линии будет мучительно медленным; То же самое происходит с имитацией отжига и другими вариантами случайного поиска (я предполагаю, что у вас нет доступа к HMC и ко всему прочему).
Итак, когда вам нужен лучший результат, когда речь идет об оценке одной функции: используйте метод Пауэлла, а также протестируйте COBYLA; Несмотря на то, что он является ограниченным алгоритмом оптимизации, поскольку он будет внутренне линейно приближать градиент вашей функции для ускорения процесса, он сможет использовать преимущества линейности вашей функции. Также обязательно попробуйте NLopt для Python . У них много оптимизаторов без градиента; попробуйте UOBYQA; это также детище Пауэлла (Безусловная оптимизация с помощью квадратичных приближений).
Очень кратко: алгоритмы N-CG зависят от вычисления гессиана, и ваш гессиан кажется очень дорогим для вычисления. NLCG и BFGS не требуют этого, хотя они могут попытаться вычислить его один раз на первом этапе.
Я специально исключил симплексный алгоритм, потому что это совершенно другой зверь; не имеет ничего общего с градиентами как таковыми. Попробуйте, но я не могу это прокомментировать; это действительно зависит от природы вашей проблемы.
Для первого хорошего справочника по численной оптимизации книга CTKelly « Итерационные методы для оптимизации» поможет вам довольно далеко, довольно приятно.
источник
Может быть, вы должны получить себе вводную книгу о численной оптимизации. Вам нужно будет принять во внимание вашу функцию, чтобы выбрать алгоритм.
Среди упомянутых вами алгоритмов важные различия заключаются в том, нужен ли якобиан или гессиан, или только сама функция.
Учитывая, что это сайт статистики и вопросов и, следовательно, имеет дело со случайными переменными: убедитесь, что ваша функция является детерминированной и может быть оценена таким образом, что дает непрерывные результаты в пространстве поиска.
источник