Python中使用Scipy的约束样条曲线拟合

2024-04-26 07:50:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道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    

关于平滑函数的选择和作用的讨论可以在前面的文章here中找到。但是,如果我们施加了一个约束,使得样条曲线需要单调递减,那么我们应该如何拟合样条曲线呢?在

谢谢你的帮助!。在

编辑: 样条曲线不需要精确拟合所有点。但是它应该满足约束条件(单调递减)。在


Tags: 数据函数编辑here文章曲线样条曲线拟合
3条回答

以积分样条函数为基函数,约束OLS系数为非负,可以施加单调性约束。非负约束使得求解比拟合普通的光滑样条函数更困难。很可能您的scipy包没有必要的功能。在

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

  • 阅读你链接的问题,我认为你只需要x就可以变得单调。如果您的数据是一个以x为索引的序列,那么只需执行UnivariateSpline(s.sort())。如果您的数据是一个数据帧,请执行UnivariateSpline(df.set_index('x')['y'].sort())

  • 也许你真的想要一个单调的样条线,尽管y(x)似乎不是单调的。{I>我们可以直接引入约束条件。生成数据的“强制单调递减”变体,如下所示:

    pd.expanding_min(s.sort())
    

    每个元素将被替换为迄今为止看到的最小元素,以抑制任何增加。来自这些数据的任何样条曲线也应该是单调的。

  • 最后,一般来说,对于带有约束的曲线拟合,checkout lmfit。它为非线性最小二乘曲线拟合器增加了一些特性scipy.optimize公司,也省去了我很多麻烦。

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

相关问题 更多 >