Как выбрать начальные значения для наименьшего квадрата lmfit?

#python #non-linear-regression #lmfit

Вопрос:

У меня есть следующая функция:

 def function(self, params, x):  a = params["a"]  b = params["b"]  c = params["c"]   return a * np.exp(-x/b)   c  

Мой текущий остаток-это:

 def residual(self, params, x, y):  return (y - self.function(params, x))**2  

Параметры:

 a = needs to be negative b = needs to be positive c = any value  

Я использую lmfit и метод наименьших квадратов. Эта проблема должна быть решена с помощью нелинейной регрессии. Мои вопросы таковы:

1.) Как я могу узнать, в порядке ли посадка? lmfit предоставляет «сообщение», но в нем говорится об успехе, хотя SSE чрезвычайно высока (и параметры a, b, c также.). Я читал, что в качестве показателя можно использовать уменьшенный хи-квадрат. Это правда? Могу ли я предположить, что если уменьшенный-хи-квадрат равен

2.) Вторая и главная проблема заключается в том, как угадать начальные значения. Прямо сейчас мои начальные значения -1, 1, 1, и иногда он находит твердое решение, но иногда SSE и параметры огромны (например, для e18), так что это явно не нормально. Та же проблема была решена, когда я поставил несколько разных начальных значений, но я пробовал только некоторые случайные значения… Итак, есть ли какой-то способ сгенерировать некоторые твердые начальные значения, чтобы мое приложение не показывало пользователю плохой график с огромными SSE и a, b, c? И, похоже, решение чрезвычайно зависит от предоставленных начальных значений.

Входные данные все время меняются. В принципе, любое плавающее число (за деньги). Примеры:

 profitList = [-10000, 100, 1000, 10000] utilityList = [0, 0.2, 0.4, 0.6, 1]  

или

 pL = [10, 500, 820, 1000, 10000] ul = [0, 0,1, 0,4, 0,7, 1]  

Спасибо

Ответ №1:

Всегда (на самом деле) желательно включать минимальный, полный пример кода, который показывает, что вы делаете. Ваш код для вашей функции модели и остатка как x , y , a , b , и c . Должны ли мы предполагать, что pL и/или utilityList соответствует одному из x или y ? Потому что, нет, мы не будем этого предполагать. Вы должны сказать, что вы делаете. Вы должны сказать это с помощью реального, рабочего кода.

1.) Как я могу узнать, в порядке ли посадка? lmfit предоставляет «сообщение», но в нем говорится об успехе, хотя SSE чрезвычайно высока (и параметры a, b, c также.). Я читал, что в качестве показателя можно использовать уменьшенный хи-квадрат. Это правда? Могу ли я предположить, что если уменьшенный-хи-квадрат равен

Постройте график полученных данных и модели. Вся статистика, связанная с хи-квадрат, основана на понимании неопределенностей. Если вы не указываете, что у вас это есть, то, вероятно, у вас этого нет.

Трудно превзойти визуальный контроль данных с помощью модели.

2.) Вторая и главная проблема заключается в том, как угадать начальные значения. Прямо сейчас мои начальные значения -1, 1, 1, и иногда он находит твердое решение, но иногда SSE и параметры огромны (например, для e18), так что это явно не нормально. Та же проблема была решена, когда я поставил несколько разных начальных значений, но я пробовал только некоторые случайные значения… Итак, есть ли какой-то способ сгенерировать некоторые твердые начальные значения, чтобы мое приложение не показывало пользователю плохой график с огромными SSE и a, b, c? И, похоже, решение чрезвычайно зависит от предоставленных начальных значений.

Возможно, неудивительно, что ответ такой же, как и на ваш первый вопрос: постройте данные с помощью модели и ваших начальных значений параметров.

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

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

Кроме того, почему ваш остаток принимает квадрат «модели данных»? Является ли намерение помешать алгоритму решения, чтобы не видеть признака остатка? Вот какой будет эффект. Вам почти наверняка будет лучше этого не делать.