5

我想知道UnivariateSpline是否可以让您进行约束样条拟合?例如,考虑以下数据:

 x         y
13    2.404070
12    1.588134
11    1.760112
10    1.771360
09    1.860087
08    1.955789
07    1.910408
06    1.655911
05    1.778952
04    2.624719
03    1.698099
02    3.022607
01    3.303135    

关于平滑函数的选择和作用的讨论可以在此处的较早帖子中找到。但是,如果我们施加一个约束,即样条曲线需要单调递减,关于我们应该如何拟合样条曲线的任何想法?

谢谢你的帮助!。

编辑:样条曲线不需要完全适合所有点。然而,它应该满足约束(单调递减)。

4

3 回答 3

2

可以通过使用积分样条作为基函数并将 OLS 系数约束为非负来施加单调性约束。非负约束使得计算解比拟合普通平滑样条更困难。您的 scipy 包可能没有必要的功能。

Mary Meyer 建议在这个问题中使用参数空间的一些有趣属性来促进计算。她在论文中提供了 R 代码。参见Meyer (2008, AoAS), Inference using shape-restricted regression splines, at 1031

于 2014-03-28T01:51:59.557 回答
1
  • 阅读您链接的问题,我认为您只需要x单调即可。如果您的数据是以 x 为索引的系列,那么只需执行UnivariateSpline(s.sort()). 如果您的数据是 DataFrame,请执行UnivariateSpline(df.set_index('x')['y'].sort()).

  • 也许您实际上想要一个单调样条,尽管 y(x) 似乎不是单调的。我知道没有办法UnivariateSpline直接引入约束,但我们可以在拟合样条之前约束数据。生成数据的“强制单调递减”变体,如下所示:

    pd.expanding_min(s.sort())
    

    每个元素都将替换为迄今为止看到的最小元素,从而抑制任何增加。来自此类数据的任何样条也应该是单调的。

  • 最后,一般来说,对于带约束的曲线拟合,请查看 lmfit。它在非线性最小二乘曲线拟合器 scipy.optimize 上添加了一些功能,为我省去了很多麻烦。

于 2013-07-30T02:58:34.973 回答
0

pyGAM 包可以拟合形状约束样条,包括单调递增的样条,请参阅https://pygam.readthedocs.io/en/latest/notebooks/tour_of_pygam.html。UnivariateSpline 无法做到这一点。在 R 中有很多包可以做到这一点,例如,scam 包(使用平方误差损失)或 cob 包,它使用 L1 损失。

于 2020-01-05T14:11:35.993 回答