Можно ли указать начальные значения для каждого параметра (вместо границ) для дифференциальной эволюции scipy?

Реализация дифференциальной эволюции Scipy (https://docs.scipy.org/doc/scipy-0.17.0/reference/generated/scipy.optimize.Differential_evolution.html) использует либо латинский гиперкуб, либо случайный метод для инициализации популяции. Выборка латинского гиперкуба пытается максимально охватить доступное пространство параметров. «random» инициализирует популяцию случайным образом. Мне интересно, можно ли указать начальные значения для каждого параметра вместо того, чтобы полагаться на эти алгоритмы по умолчанию.

Для сложных моделей (особенно тех, которые математически неразрешимы и, следовательно, должны быть смоделированы) я заметил, что 2 независимых прогона дифференциальной эволюции scipy, вероятно, дают разные результаты после X итераций алгоритма (я обычно устанавливаю X = 100, чтобы избежать запуска агоритм в течение нескольких дней). Я думаю, это потому, что (1) инициализация популяции не идентична между двумя независимыми прогонами (из-за стохастического характера методов инициализации популяции «случайный» и «гиперкуб») и (2) в прогнозировании модели присутствует шум. Таким образом, я думаю запустить ~ 10 независимых прогонов DE со 100 итерациями, выбрать наиболее подходящий набор параметров для 10 прогонов и использовать этот набор в качестве начальных значений для финального прогона с большим количеством итераций (скажем, 200). Проблема в том, что я не вижу способа вручную ввести эти начальные значения в реализации DE scipy. Буду очень признателен, если кто-нибудь из сообщества сможет мне помочь.




Ответы (1)


Это действительно было возможно начиная с версии 1.1. SciPy (обратите внимание, что вы имеете в виду документацию от 0.17.0). В частности, последние версии позволяют указать любой массив, а не только 'hypercube' или 'random'. Из документации возможное значение init:

массив, определяющий начальную популяцию. Массив должен иметь форму (M, len(x)), где len(x) — количество параметров. init обрезается до границ перед использованием.

https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.Differential_evolution.html

Если по какой-то причине вы вынуждены использовать старую версию, все еще можно получить то, что вы хотите, просто используя вместо этого базовую версию DifferentialEvolutionSolver. Там вы можете либо пропатчить одну из функций инициализации, либо просто запустить их и вручную переопределить атрибут population после инициализации.

person fuglede    schedule 18.08.2019
comment
Отличный ответ спасибо. Я немного смущен тем, как должна быть указана начальная популяция. Представьте, что у меня есть 3 значения A, B и C, соответствующие начальным значениям для моих 3 параметров. Я попытался установить init = startup_matrix, где startup_martix = np.tile(np.array[A,B,C], (5,1)). Весьма удивительно, что наиболее подходящие параметры на каждой итерации DE не развиваются. Любая идея, почему и как я мог бы лучше указать свое предположение? - person user1363251; 30.10.2019
comment
Боюсь, не совсем. Вы получите что-нибудь интересное, имея одинаковые популяции в целом? В любом случае SciPy имеет открытый исходный код, поэтому вы можете просто пройтись по реализации, чтобы увидеть, как выполняются обновления на каждом этапе. - person fuglede; 30.10.2019