在 Python 中使用 Scipy 进行约束样条拟合

Pra*_*tra 5 python numpy curve-fitting scipy pandas

我想知道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    
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的帮助!。

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

Dan*_*lan 1

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

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

    pd.expanding_min(s.sort())
    
    Run Code Online (Sandbox Code Playgroud)

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

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