将成本函数转换为statsmodels公式

时间:2018-02-17 12:13:16

标签: python regression statsmodels patsy

我想将一些数据拟合到曲线上,将其用作成本函数:

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 个答案:

答案 0 :(得分:0)

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()

如果符合要求,您将获得param0param1的值,如果您使用上面的等式,则可以将这些值转换回x[0]x[1]值与你之前得到的相比。