Функция для определения разумного начального предположения для scipy.optimize?

Я использую scipy.optimize. свернуть, чтобы найти минимум четырехмерной функции, который довольно чувствителен к исходному предположению. Если я немного его изменю, решение существенно изменится.

Есть много вопросов, похожих на этот, уже в SO (например: 1, 2, 3), но настоящего ответа нет.

В моем старом вопросе один из разработчиков сайта zunzun.com (очевидно, больше не в сети) объяснил, как им это удалось:

Zunzun.com использует генетический алгоритм дифференциальной эволюции (DE) для поиска начальных оценок параметров, которые затем передаются в решающую программу Левенберга-Марквардта в scipy. DE фактически не используется как глобальный оптимизатор как таковой, а скорее как «средство определения начальных параметров».

Наиболее близким к этому алгоритму, который я нашел, является этот ответ, где блок for используется для многократного вызова функции минимизации с случайные начальные догадки. Это генерирует несколько минимизированных решений, и, наконец, выбирается лучшее (наименьшее значение).

Есть ли что-то вроде того, что описал разработчик zunzun, уже реализованный на Python?


person Gabriel    schedule 09.02.2016    source источник
comment
Ваш вопрос очень похож на этот вопрос (хотя и старый). В ответе содержится ссылка на anneal. который использует имитацию отжига, которая часто используется вместо алгоритмов GA. Они также упоминают PyEvolve как библиотеку, которая предоставляет генетические алгоритмы.   -  person Bakuriu    schedule 09.02.2016
comment
отжиг устарел, но, очевидно, прыгающий по бассейну делает именно то, что я просил. Хотели бы вы опубликовать свой cmmt в виде ответа?   -  person Gabriel    schedule 09.02.2016
comment
Мне удалось реализовать генетические алгоритмы с помощью DEAP. sklearn.grid_search также предлагает различные исчерпывающие и стохастические методы оптимизации гиперпараметров.   -  person ali_m    schedule 09.02.2016


Ответы (1)


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

Очевидно, вы также можете работать с десятками так называемых «мета-оптимизаторов», которые представляют собой всего лишь набор эвристик, которые могут (или нет) работать для вашего конкретного приложения. К ним относятся случайная начальная точка выборки в цикле с использованием генетических алгоритмов или, насколько мне известно, наиболее математически оправданный подход, с использованием байесовской оптимизации. В общем, идея состоит в том, чтобы моделировать вашу функцию в то же время, когда вы пытаетесь ее минимизировать, таким образом вы можете сделать осознанное предположение, с чего начать в следующий раз (что уровень абстракции выше, чем случайное предположение или использование генетических алгоритмов / дифференциальной эволюции) . Таким образом, я бы упорядочил эти методы следующим образом

  • поиск по сетке / случайная выборка - не использует информацию из предыдущих прогонов, поэтому - худшие результаты
  • генетический подход, эволюционный, бассейновый обруч, отжиг - используйте информацию из предыдущих прогонов в виде пар (x, f (x)) в течение ограниченного периода времени (поколения) - таким образом, средние результаты
  • Байесовская оптимизация (и аналогичные методы) - используйте информацию из всего предыдущего опыта посредством моделирования базовой функции и выполнения выборки на основе ожидаемого улучшения - лучшие результаты (за счет наиболее сложных методов)
person lejlot    schedule 09.02.2016
comment
Отличный ответ, очень подробный. Спасибо, лейлот! - person Gabriel; 09.02.2016