Минимизация медленной, шумной, нечетко определенной целевой функции

Мой вопрос: существуют ли алгоритмы минимизации, предпочтительно реализованные на Python, которые могут работать с функцией это медленный (~ 1-10 с) и принимает данные из действующей системы, что не займет больше пары часов?

У меня есть ПЛИС, которая запускает фильтр по некоторым данным датчика и использует вывод этого фильтра для повышения производительности другого устройства. Я хочу найти оптимальный фильтр.Мои попытки смоделировать систему и использовать различные методы обработки сигналов не дали адекватных результатов, поэтому сейчас я попытаюсь решить эту проблему на самой живой системе (во всяком случае, просто чтобы доказать, что такой оптимальный фильтр возможен).

Фильтр можно запрограммировать по последовательной линии, а производительность другого устройства можно измерить по последовательной линии.

Итак, я могу построить функцию, которая:

  • Принимает параметры, определяющие фильтр.
  • Программирует фильтр через последовательную линию
  • Получает данные через последовательную линию
  • Вычисляет меру того, насколько хорош фильтр есть (в том смысле, что чем меньше, тем лучше)

Это означает, что у меня есть функция, которую можно использовать как цель для минимизации. Но вот проблемы:

Это медленно

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

Это не очень хорошо определено

(Обратите внимание, что x ниже - это вектор в пространстве параметров моей целевой функции.)

Проще говоря, x1 == x2 не означает f (x1) == f (x2) . Из-за шумности системы выборка целевой функции f (x) в одной и той же точке в ее пространстве параметров может дать разные результаты из-за зашумленности системы.

Первое, что пришло мне в голову, это заставить целевую функцию фактически усреднить несколько измерений и увеличить значение допуска для любой подпрограммы минимизации, которую я выполняю. Но, глядя на фактические числа, в худшем случае я мог бы изменить (среднее) значение f (x) на 2,0 во всем диапазоне параметров, но стандартное отклонение выборки будет 1,6. Это означает, что если я хочу уменьшить стандартную ошибку ( s / sqrt (n) ), скажем, до 0,1, мне нужно будет измерить ту же точку 250 раз, что дает каждое измерение занимает 30 минут . Ура.

Есть уловки, которые я могу использовать, чтобы улучшить это, скажем, чтобы получить размах ~ 20 в диапазоне параметров со стандартным отклонением 0,25 в любой заданной точке. Но со временем у этих уловок есть и другие компромиссы.

Уступки

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

Я начал изучать процедуры минимизации в SciPy , но поскольку многие параметры недокументированы или взаимозависимы, это похоже на прогулку в темноте (каждый шаг занимает несколько часов).

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

5
задан detly 12 December 2011 в 01:37
поделиться