Преобразовать функцию стоимости в формулу statsmodels

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

def cost_func(x):
    return ((unknown_conc-x[1]*(x[0]*conc_A+
           (1-x[0])*conc_B))**2).sum()

Это работает при использовании scipy.optimize, но я хочу вместо этого использовать statsmodels. Однако я борюсь с определением формулы statsmodels. У вас есть идеи, как это сделать?

Я пробовал что-то вроде этого, но это не работает с этим x*A + (1-x)*B:

result = sm.ols(formula="A ~ I(B + C) -1", data=df).fit()

1 ответ

Решение

Формулы Statsmodels/patsy - это язык для написания линейных моделей, поэтому вам нужно найти способ сформулировать вашу проблему как формулу, где прогнозируемое значение является линейной функцией параметров, которые вы хотите подогнать.

В этом случае вы делаете подгонку методом наименьших квадратов там, где прогноз (используя синтаксис Python):

x[1]*(x[0]*conc_A + (1 - x[0])*conc_B)

Расширяя сроки, мы получаем:

x[1]*x[0]*conc_A + x[1]*(1 - x[0])*conc_B

Давайте определим новые параметры param0 = x[1]*x[0] а также param1 = x[1]*(1 - x[0]), Теперь наш прогноз становится

param0*conc_A + param1*conc_B

Обратите внимание, что они обратимы, т.е. имеют место следующие равенства:

x[0] = param0 / (param0 + param1)
x[1] = param0 + param1

таким образом, эта репараметризация не меняет основную модель, которая нам подходит, она просто меняет то, как мы ее представляем. Но новое представление линейно по параметрам, поэтому теперь мы можем преобразовать его в формулу statsmodels/patsy:

"conc_A + conc_B - 1"

И, наконец, давайте поместим значение, против которого мы подходим в наших прогнозах, в формулу:

result = sm.ols("unknown_conc ~ conc_A + conc_B - 1", data=df).fit()

Если вам это подходит, вы получите значения для param0 а также param1, и если вы используете уравнения выше, вы можете преобразовать их обратно в x[0] а также x[1] значения для сравнения с тем, что вы получали раньше.

Другие вопросы по тегам