эффективный алгоритм поиска минимума функции многих переменных

У меня есть функция с несколькими переменными, которую я хочу минимизировать. Функция имеет два входных аргумента, вектор c и скаляр \theta.

Использование fmincon в MATLAB для решения задачи оптимизации как для c, так и для \theta сложно, потому что определенные значения \theta вызывают числовые ошибки. Однако исправление тета, c может быть легко получено с помощью fmincon без каких-либо ошибок.

Таким образом, теперь план состоит в том, чтобы применить метод грубой силы, т.е. вычислить c для каждого значения \theta в диапазоне 1:100 (хотя истинное ограничение для \theta равно \theta \ge 0) и выбрать \theta (и соответствующее в) для которых целевое значение минимизируется просто путем подстановки оцененных параметров обратно в целевую функцию.

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

Большое спасибо!


person user157279    schedule 30.11.2014    source источник


Ответы (2)


Вы должны позволить fmincon работать на вас как на c, так и на theta. Если у него есть проблемы с получением приличного результата при включении тета, это, вероятно, потому, что элементы в c и theta имеют очень разные масштабы. Вы должны масштабировать свои уравнения так, чтобы все переменные в конечном итоге имели значение около 1,0. Это значительно повышает производительность (то есть скорость) и точность почти любого кода числовой оптимизации.

Итак, если вы подозреваете, что окончательные значения c могут оказаться равными [1,0 0,001 10,0], и подозреваете, что тета может оказаться равной [10,0], вы должны сформулировать свою проблему так:

>>>>>>>>>>>>>>>>>>>>> in your main program prior to invoking fmincon
c = [1.0 0.001 10.0]
theta = 10.0
foo_x = [c(:);thetha];
scale_fac = [1.0 1000.0 0.1 0.1];
x = foo_x .* scale_fac;  %scale your seed values to be near 1.0

>>>>>>>>>>>>>> inside your function
function err = myfunction(x,scale_fac)
foo_x = x ./ scale_fac;  %de-scale to get back to correct magnitude
c = foo_x(1:3);
theta = foo_x (4);

...rest of your code
person chipaudette    schedule 30.11.2014
comment
Привет, чиподетт, я понимаю, что ты имеешь в виду, но боюсь, что моя целевая функция сложнее этого. Моя целевая функция — это многомерное нормальное распределение, а тета, о которой я говорю, — это параметр корреляции. Таким образом, он появляется в определителе ковариации, а также в обратной матрице ковариации. В зависимости от начального значения тета целевая функция должна иметь дело с почти сингулярными матрицами, что приводит к ошибкам... - person user157279; 30.11.2014
comment
Вы можете сделать фминкон внутри фминкона. Таким образом, на верхнем уровне вы должны искать через тета (переменную, которую вы собираетесь выполнить методом грубой силы). Внутри этого, где вам теперь дается тета, вы можете снова вызвать функцию fmincon, на этот раз решая для c. Поскольку fmincon будет делать что-то умнее, чем поиск методом грубой силы, он может быть более эффективным. - person chipaudette; 30.11.2014

Поиск пополам по тета будет работать только в том случае, если целевая функция выпукла (или квазивыпукла) по тета. В противном случае вы рискуете найти локальный минимум вместо глобального.

Выполнение вложенного fmincon, как предлагает @chipaudette, должно работать, если вы выбираете решатель, способный решать невыпуклые задачи оптимизации. (справка по MATLAB по этой теме немного расплывчата. , но я думаю, что решатель SQP должен быть в порядке.) Но я подозреваю, что будет более эффективно просто перечислять соответствующий диапазон тета, а не использовать для этого fmincon.

person LarrySnyder610    schedule 30.11.2014