考虑以下示例:

import statsmodels.formula.api as smf
import random
import pandas as pd

df = pd.DataFrame({'y' : [x**2 + random.gauss(2)   for x in range(10)],
             'x' : [x for x in range(10)]})



model = smf.ols(data = df, formula = 'y ~ x + I(x**2) +  I(x**3)').fit()

df['pred'] = model.predict(df)

df.set_index('x').plot()

enter image description here

如你所见,我将一个立方模型与我的数据进行了拟合,总体来说,我的拟合相当不错.但是,我希望将我的立方体模型约束为在两个特定的x点处具有以下值:

  • f(0) = 10
  • f(8) = 60

我怎么能在statsmodelssklearn中做到这一点呢? 谢谢!

推荐答案

你可以用glm代替fit_constrained.

import random

import pandas as pd
import statsmodels.formula.api as smf

df = pd.DataFrame(
    {
        "y" : [x ** 2 + random.gauss(2, 1) for x in range(10)],
        "x" : [x for x in range(10)],
    }
)

untrained_glm = smf.glm("y ~ x + I(x ** 2) + I(x ** 3)", df)

trained_glm = untrained_glm.fit_constrained(
    ([[1, 0, 0, 0], [1, 8, 64, 512]], [8, 60])
)

df["pred"] = trained_glm.predict(df)

结果:

>>> df
           y  x       pred
0   0.191139  0   8.000000
1   3.225092  1   6.110541
2   5.353590  2   7.008272
3   9.367904  3  10.498092
4  16.512384  4  16.384900
5  28.742154  5  24.473595
6  36.584476  6  34.569078
7  51.006869  7  46.476246
8  66.839006  8  60.000000
9  82.163031  9  74.945239

(编辑以添加对约束的解释)

假设模型为y = a + b * x + c * (x ** 2) + d * (x ** 3) + e,其中e是误差项,a是截距,bcd是其他次数的系数.

拟合模型f将满足f(0) = 8当且仅当8 = a_est + b_est * 0 + c_est * 0 + d_est * 0,且将满足f(8) = 60当且仅当60 = a_est + b_est * 8 + c_est * (8 ** 2) + d_est * (8 ** 3).

因此,我在模型中添加了以下约束:

1 * a + 0 * b + 0 * c + 0 * d = 8
1 * a + 8 * b + 64 * c + 512 * d = 60

Python相关问答推荐

在Pandas框架中截短至固定数量的列

使用pandas、matplotlib和Yearbox绘制时显示错误的年份

Chatgpt API不断返回错误:404未能从API获取响应

使用numpy提取数据块

SQLGory-file包FilField不允许提供自定义文件名,自动将文件保存为未命名

未删除映射表的行

更改键盘按钮进入'

如何从.cgi网站刮一张表到rame?

使用groupby Pandas的一些操作

从spaCy的句子中提取日期

改进大型数据集的框架性能

Python逻辑操作作为Pandas中的条件

在两极中过滤

如何防止Pandas将索引标为周期?

从列表中获取n个元素,其中list [i][0]== value''

如何创建引用列表并分配值的Systemrame列

Odoo16:模板中使用的docs变量在哪里定义?

如果包含特定值,则筛选Groupby

根据客户端是否正在传输响应来更改基于Flask的API的行为

Python将一个列值分割成多个列,并保持其余列相同