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()
../../_images/scipy-interpolate-make_lsq_spline-1_00_00.png

NaN处理 :如果输入数组包含 nan 值,则结果是没有用的,因为底层样条拟合例程无法处理 nan 。解决方法是对非数字数据点使用零权重:

>>> y[8] = np.nan
>>> w = np.isnan(y)
>>> y[w] = 0.
>>> tck = make_lsq_spline(x, y, t, w=~w)

请注意,需要将 nan 通过一个数值(只要相应的权重为零,精确值就无关紧要。)