【问题标题】:convert cost function to statsmodels formula将成本函数转换为 statsmodels 公式
【发布时间】:2018-07-28 05:03:57
【问题描述】:

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

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

【问题讨论】:

    标签: python regression statsmodels patsy


    【解决方案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()
    

    如果您符合此条件,您将获得 param0param1 的值,如果您使用上面的公式,您可以将这些值转换回 x[0]x[1] 值,以便与之前获得的值进行比较.

    【讨论】:

    • 谢谢你,它工作得很好,给我和 scipy 一样的结果。但是,您知道如何处理参数的差异吗?那么如何根据 param0 和 param1 的方差计算 x[0] 和 x[1] 的方差?
    • 这是一个不同且更深层次的问题...我相信,如果您做出一些标准的分布假设,那么 OLS 统计数据将为您提供 x[1] 方差的估计值,而不是 x [0]。也许是自举?您可能应该在 stats stackexchange 上询问。
    猜你喜欢
    • 1970-01-01
    • 2018-07-25
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多