scipy.interpolate.make_lsq_spline¶
- scipy.interpolate.make_lsq_spline(x, y, t, k=3, w=None, axis=0, check_finite=True)[源代码]¶
计算LSq B样条的(系数)。
结果是一个线性组合
\[s(X)=\sum_j c_j B_j(x;t)\]在B样条基元中, \(B_j(x; t)\) ,这将最小化
\[\sum_{j}\Left(w_j\Times(S(X_J)-y_j)\Right)^2\]- 参数
- x类似阵列,形状(m,)
横坐标。
- y类似数组,形状(m,.)
坐标。
- t类阵列,形状(n+k+1,)。
结。节点和数据点必须满足勋伯格-惠特尼条件。
- k整型,可选
B样条次数。默认值为立方体,k=3。
- wARRAY_LIKE,Shape(n,),可选
样条曲线拟合的权重。一定是阳性的。如果
None
,那么权重都是相等的。默认值为None
。- axis整型,可选
插值轴。默认值为零。
- check_finite布尔值,可选
是否检查输入数组是否仅包含有限数字。禁用可能会带来性能提升,但如果输入确实包含无穷大或NAN,则可能会导致问题(崩溃、非终止)。默认值为True。
- 退货
- b :阶数的B样条对象 k 打着结 t 。一个B样条对象的阶数
参见
BSpline
表示B样条对象的基类
make_interp_spline
用于插值样条的类似工厂函数
LSQUnivariateSpline
一种基于FITPACK的样条拟合程序
splrep
一种基于FITPACK的拟合程序
注意事项
数据点的数量必须大于样条阶数 k 。
打结 t 必须满足勋伯格-惠特尼条件,即必须存在数据点的子集
x[j]
这样一来,t[j] < x[j] < t[j+k+1]
,用于j=0, 1,...,n-k-2
。示例
生成一些有噪声的数据:
>>> rng = np.random.default_rng() >>> x = np.linspace(-3, 3, 50) >>> y = np.exp(-x**2) + 0.1 * rng.standard_normal(50)
现在,使用预定义的内部结拟合平滑三次样条线。在这里,我们通过添加边界节点使节点向量(k+1)为正则:
>>> from scipy.interpolate import make_lsq_spline, BSpline >>> t = [-1, 0, 1] >>> k = 3 >>> t = np.r_[(x[0],)*(k+1), ... t, ... (x[-1],)*(k+1)] >>> spl = make_lsq_spline(x, y, t, k)
为了进行比较,我们还为同一组数据构造了插值样条:
>>> from scipy.interpolate import make_interp_spline >>> spl_i = make_interp_spline(x, y)
同时绘制两个:
>>> import matplotlib.pyplot as plt >>> xs = np.linspace(-3, 3, 100) >>> plt.plot(x, y, 'ro', ms=5) >>> plt.plot(xs, spl(xs), 'g-', lw=3, label='LSQ spline') >>> plt.plot(xs, spl_i(xs), 'b-', lw=3, alpha=0.7, label='interp spline') >>> plt.legend(loc='best') >>> plt.show()
NaN处理 :如果输入数组包含
nan
值,则结果是没有用的,因为底层样条拟合例程无法处理nan
。解决方法是对非数字数据点使用零权重:>>> y[8] = np.nan >>> w = np.isnan(y) >>> y[w] = 0. >>> tck = make_lsq_spline(x, y, t, w=~w)
请注意,需要将
nan
通过一个数值(只要相应的权重为零,精确值就无关紧要。)