В этой серии статей вы узнаете, как генетические алгоритмы (также называемые эволюционными алгоритмами) могут помочь вам решать нелинейные задачи!
В первых статьях этой серии (ссылки на Часть 1 и Часть 2) я описал два возможных (и простых) способа использования генетических алгоритмов для решения нелинейных задач:
- Изучите как можно большую вселенную решений и выберите лучшее (-ие)
- Одно поколение за другим сужайте диапазон, исследуемый для каждой функции, чтобы быстрее находить оптимальное решение.
В этой последней статье мы будем использовать алгоритм, немного отличный от двух первых, основанный на принципе «мутации».
Идея заключается в следующем:
Мы инициируем первое поколение на основе характеристик исходного набора данных.
Мы выбираем n лучших людей этого поколения, исходя из их физической формы.
Мы создаем новое поколение, дублируя этих лучших людей и случайным образом изменяя их характеристики (= значения характеристик); это процесс «мутации». В данном примере это изменение будет выполнено в соответствии с коэффициентом стандартного отклонения.
Важно отметить, что существует несколько способов выполнения мутаций, основанных на случайности, различных типах распределений и т. Д. Эти вариации можно комбинировать с кроссоверами между функциями и / или индивидуумами. Процесс отбора также может быть основан на более сложных принципах, чем сортировка / разделение: турнир, рулетка и другие вероятностные методы, которые широко задокументированы.
Первоначальное создание набора данных и обучение модели аналогичны описанным в Части 2.
Мы доработаем этот процесс с помощью нескольких настроек:
- Мы предотвращаем выход значений признаков за пределы первоначально наблюдаемых пределов вселенной (= universe_constraints).
- Процесс мутации будет реализован с коэффициентом 0,5, который можно резюмировать следующим образом:
new_value = original_feature_value +/- one standard deviation * 0.5
- По мере выполнения процесса оптимизации коэффициент стандартного отклонения будет постепенно уменьшаться, чтобы помочь более точно настроить отдельные характеристики. Для тех, кто знаком с проблемами Learning_rates, философия такая же!
Generation # / Distance from target 0 : 0.1339725062531727 1 : 0.10594988801634031 2 : 0.019531289828471188 5 : 0.01204014370247819 8 : 0.009155880407085704 11 : 0.008608138256597897 39 : 0.006970989388712212 47 : 0.0029122949569213574 55 : 0.001959993072830457 73 : 0.0012105657915313373 248 : 0.0011502227638615636 263 : 0.0008513611293921031 274 : 0.0000013788767674327573
Та же таблица с расстояниями, умноженными на 10⁶ для удобства чтения:
Я хотел бы сделать небольшой обзор плюсов и минусов, которые я наблюдал для этих трех методов, поскольку все они предлагают интересные функции.
- Большой случайный выбор (Часть 1) предлагает быстрые результаты, но требует больших вычислений по мере увеличения количества функций и сложности модели.
- Узкий выбор мин. И макс. (Часть 2) позволит достичь гораздо большей точности при меньшем количестве созданных индивидов.
- Выбор Std-Dev (часть 3) будет предлагать повышенную точность, но в значительной степени зависит от критериев создания процесса и выбора, которые мы определяем.
‹Ширина iframe =” 900 height = ”800 frameborder =” 0 scrolling = ”no” src = ”// plotly.com/~pierrelouisbescond/1.embed” ›‹/iframe›
Я искренне надеюсь, что вы оценили эту серию статей об оптимизации нелинейных задач!