我想为数据集拟合单调递增的平滑样条函数
编码:
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]
我想打印出分段多项式函数,以了解样条函数的样子。
1条答案
按热度按时间ix0qys7i1#
使用scipy.interpolate中的
splrep
,并手动调整其s
参数,该参数控制平滑量。编辑:
splrep
返回的样条函数的定义,就节点和系数而言,等价于scipy.interpolate.BSpline
,https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.BSpline.html