用Scipy拟合单调递增样条函数

ecr0jaav  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(169)

我想为数据集拟合单调递增的平滑样条函数
编码:

from scipy.interpolate import interp1d
import matplotlib.pyplot as plt

x = [0., 0.75, 1.8, 2.25, 3.75, 4.5, 6.45, 6.75, 7.5, 8.325, 10.875, 11.25, 12.525, 12.75, 15., 20.85, 21.]
    y = [2.83811035, 2.81541896, 3.14311655, 3.22373554, 3.43033456, 3.50433385, 3.66794514, 3.462296, 3.59480959,
         3.56250726, 3.6209845,  3.63034523, 3.68238915, 3.69096892, 3.75560395, 3.83545191, 3.90419498]

    plt.plot(x, y, '*')
    plt.show()
    f = interp1d(x, y, kind='cubic')
    yinp = f(x)
    plt.plot(x, yinp)
    plt.show()

目前的拟合看起来像上面。我想知道如何拟合一个单调递增的样条函数。
我在r中找到了一个例子,在这里发布了How to make monotonic (increasing) smooth spline with smooth.spline() function?。我不确定scipy库中什么是合适的函数。
建议真的会很有帮助。
编辑:我正在寻找类似下面的东西(ref.

编辑2:
我现在使用平滑样条函数scipy.interpolate.UnivariateSpline

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import UnivariateSpline

x = np.array([0., 0.75, 1.8, 2.25, 3.75, 4.5, 6.45, 6.75, 
              7.5, 8.325, 10.875, 11.25, 12.525, 12.75, 15., 
              20.85, 21.])
y = np.array([2.83811035, 2.81541896, 3.14311655, 
              3.22373554, 3.43033456, 3.50433385, 
              3.66794514, 3.462296,   3.59480959, 
              3.56250726, 3.6209845,  3.63034523, 
              3.68238915, 3.69096892, 3.75560395, 
              3.83545191, 3.90419498])

spl = UnivariateSpline(x, y, s=0.05)
xs  = np.linspace(x.min(), x.max(), 100)
plt.plot(x, y, 'ro', ms=5)
plt.plot(xs, spl(xs), 'cyan', lw=1)
plt.show()

给出以下结果

我可以用下面的公式得到样条的系数和节点

print(spl.get_coeffs())
    print(spl.get_knots())

    k = 3
    tck = splrep(xmean, ymean, k=k, s=0.09)
    knots = tck[0]
    coeffs = tck[1]
    print('knot points=', knots)
    print('coefficients=', coeffs)

但我不知道如何使用系数和手动生成样条曲线的函数。有人可以添加更多的细节吗?
例如,当我们有4个数据点时

x = [0., 0.75, 1.8, 2.25]
y = [2.83811035, 2.81541896, 3.14311655, 3.22373554]

我想打印出分段多项式函数,以了解样条函数的样子。

ix0qys7i

ix0qys7i1#

使用scipy.interpolate中的splrep,并手动调整其s参数,该参数控制平滑量。
编辑:splrep返回的样条函数的定义,就节点和系数而言,等价于scipy.interpolate.BSplinehttps://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.BSpline.html

相关问题