Динамический диапазон неизвестных параметров и форма функции стоимости в scipy.optimize.least_squares - PullRequest
0 голосов
/ 15 мая 2018

Я использую scipy.optimize.least_squares для решения нелинейной задачи оптимизации наименьших квадратов с ограничением по интервалу.Форма моей конкретной проблемы заключается в том, чтобы найти a0, a1, b0 и b1 так, чтобы функция стоимости:

\ sum ^ N_ {n = 1} (g_n - (y_n - b0 e ^ - (tn / b1)) / a0 e ^ - (tn / a1)) ^ 2

сводится к минимуму, когда известны g_n, y_n и t_n и существуют интервальные ограничения для a0, a1, b0 и b1.

Четыре неизвестных параметра охватывают приблизительно четыре порядка (например, a0 = 2e-3, a1 = 30, аналогично для b0 и b1).Я слышал, что большой динамический диапазон неизвестных параметров может быть численно проблематичным для процедур оптимизации.

Мой первый вопрос заключается в том, будет ли проблемным для scipy.optimize.minimize диапазон в четыре порядка.Процедура, кажется, сходится на данных, которые я применял до сих пор.

Мой второй вопрос касается формы функции стоимости.Я могу эквивалентно написать это как:

\ sum ^ N_ {n = 1} (g_n - (1 / a0 e ^ (tn / a1) y_n - b0 / a0 e ^ - (tn / b1) +tn / a1) /) ^ 2

=

\ sum ^ N_ {n = 1} (g_n - (a0 'e ^ (tn / a1) y_n - b0' e ^ -(tn * b1 '))) ^ 2

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

1 Ответ

0 голосов
/ 17 мая 2018

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

Деление по степени свободы может вызвать трудности тремя способами:

  1. деление на ноль
  2. разрывные производные около 0
  3. очень крутые производные около 0, или очень плоские производные, далекие от 0

По этим причинам я бы рекомендовал \ sum ^ N_ {n = 1} (g_n - (a0 'e ^ (tn / a1) y_n - b0' e ^ - (tn * b1 '))) ^ 2. Однако, как уже говорилось ранее, если это уже работает, возможно, оно не стоит усилий, чтобы переформулировать вашу проблему.

...