将成本函数转换为 statsmodels 公式
convert cost function to statsmodels formula
我想将一些数据拟合成一条曲线,将其用作成本函数:
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()
Statsmodels/patsy 公式是一种用于编写线性模型的语言,因此您需要找到一种方法将您的问题表述为公式,其中预测值是您要拟合的参数的线性函数。
在这种情况下,您正在 least-squares 拟合预测所在的位置(使用 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]
值与您之前得到的值进行比较。
我想将一些数据拟合成一条曲线,将其用作成本函数:
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()
Statsmodels/patsy 公式是一种用于编写线性模型的语言,因此您需要找到一种方法将您的问题表述为公式,其中预测值是您要拟合的参数的线性函数。
在这种情况下,您正在 least-squares 拟合预测所在的位置(使用 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]
值与您之前得到的值进行比较。