UnivariateSpline#
- class scipy.interpolate.UnivariateSpline(x, y, w=None, bbox=[None, None], k=3, s=None, ext=0, check_finite=False)[源码]#
对给定的数据点进行一维平滑样条拟合。
旧版
此类被视为旧版,将不再接收更新。尽管我们目前没有计划删除它,但我们建议新代码使用更现代的替代方案。特别是,我们建议使用
make_splrep代替。拟合一个次数为 k 的样条 y = spl(x) 到提供的 x, y 数据。 s 通过指定平滑条件来指定节点数。
- 参数:
- x(N,) array_like
一维独立输入数据数组。必须是递增的;如果 s 为 0,则必须是严格递增的。
- y(N,) array_like
一维依赖输入数据数组,与 x 的长度相同。
- w(N,) array_like, optional
用于样条拟合的权重。必须是正数。如果 w 为 None,则所有权重均为 1。默认是 None。
- bbox(2,) array_like, optional
指定近似区间边界的二维序列。如果 bbox 为 None,则
bbox=[x[0], x[-1]]。默认是 None。- kint, 可选
平滑样条的次数。必须满足 1 <= k <= 5。
k = 3是三次样条。默认是 3。- sfloat or None, optional
用于选择节点数的正平滑因子。节点数将增加,直到满足平滑条件
sum((w[i] * (y[i]-spl(x[i])))**2, axis=0) <= s
但是,由于数值问题,实际条件是
abs(sum((w[i] * (y[i]-spl(x[i])))**2, axis=0) - s) < 0.001 * s
如果 s 为 None,则 s 将被设置为 len(w),用于进行使用所有数据点的平滑样条。如果为 0,样条将通过所有数据点进行插值。这等效于
InterpolatedUnivariateSpline。默认是 None。用户可以使用 s 来控制拟合的接近度和光滑度之间的权衡。较大的 s 表示更多的平滑,而较小的 s 值表示较少的平滑。 s 的推荐值取决于权重 w。如果权重代表 y 的标准差的倒数,那么一个好的 s 值应该在 (m-sqrt(2*m),m+sqrt(2*m)) 的范围内,其中 m 是 x, y 和 w 中的数据点数。这意味着如果1/w[i]是y[i]的标准差的估计值,那么s = len(w)将是一个好值。- extint or str, optional
控制不在节点序列定义的区间内的元素的外插模式。
如果 ext=0 或 ‘extrapolate’,则返回外插值。
如果 ext=1 或 ‘zeros’,则返回 0
如果 ext=2 或 ‘raise’,则引发 ValueError
如果 ext=3 或 ‘const’,则返回边界值。
默认是 0。
- check_finitebool, optional
是否检查输入数组是否只包含有限数值。禁用此项可能会提高性能,但如果输入包含无穷大或 NaN,则可能导致问题(崩溃、不终止或结果不合理)。默认是 False。
方法
__call__(x[, nu, ext])在位置 x 处评估样条(或其 nu 阶导数)。
antiderivative([n])构建一个新的样条,表示此样条的抗导数。
derivative([n])构建一个新的样条,表示此样条的导数。
derivatives(x)返回样条在点 x 处的所有导数。
返回样条系数。
返回样条内部节点的位置。
返回样条近似的加权残差平方和。
integral(a, b)返回样条在两给定点之间的定积分。
roots()返回样条的零点。
继续使用给定的平滑因子 s 和上次调用时找到的节点进行样条计算。
validate_input
另请参阅
BivariateSpline一个用于双变量样条的基类。
SmoothBivariateSpline通过给定点进行平滑的双变量样条
LSQBivariateSpline使用加权最小二乘拟合的双变量样条
RectSphereBivariateSpline球体上的矩形网格的双变量样条
SmoothSphereBivariateSpline球坐标中的平滑双变量样条
LSQSphereBivariateSpline使用加权最小二乘拟合的球坐标中的双变量样条
RectBivariateSpline矩形网格上的双变量样条
插值单变量样条用于给定数据集的一维插值样条。
bisplrep一个用于查找曲面的双变量 B-样条表示的函数
bisplev一个用于评估双变量 B-样条及其导数的函数
splrep一个用于查找一维曲线 B-样条表示的函数
splev一个用于评估 B-样条或其导数的函数
sproot一个用于查找三次 B-样条根的函数
splint一个用于计算 B-样条在两给定点之间的定积分的函数
spalde一个用于评估 B-样条所有导数的函数
附注
数据点的数量必须大于样条次数 k。
NaN 处理: 如果输入数组包含
nan值,则结果无用,因为底层的样条拟合例程无法处理nan。一种变通方法是为非数字数据点使用零权重>>> import numpy as np >>> from scipy.interpolate import UnivariateSpline >>> x, y = np.array([1, 2, 3, 4]), np.array([1, np.nan, 3, 4]) >>> w = np.isnan(y) >>> y[w] = 0. >>> spl = UnivariateSpline(x, y, w=~w)
注意需要将
nan替换为数值(只要相应权重为零,具体数值无关紧要)。数组 API 标准支持
UnivariateSpline不支持 NumPy 以外的 Python Array API Standard 兼容后端。有关更多信息,请参阅 对数组 API 标准的支持。
参考文献
[1]P. Dierckx,“An algorithm for smoothing, differentiation and integration of experimental data using spline functions”,J.Comp.Appl.Maths 1 (1975) 165-184。
[2]P. Dierckx,“A fast algorithm for smoothing data on a rectangular grid while using spline functions”,SIAM J.Numer.Anal. 19 (1982) 1286-1304。
[3]P. Dierckx,“An improved algorithm for curve fitting with spline functions”,report tw54, Dept. Computer Science,K.U. Leuven, 1981。
[4]P. Dierckx, “Curve and surface fitting with splines”, Monographs on Numerical Analysis, Oxford University Press, 1993。
示例
>>> import numpy as np >>> import matplotlib.pyplot as plt >>> from scipy.interpolate import UnivariateSpline >>> rng = np.random.default_rng() >>> x = np.linspace(-3, 3, 50) >>> y = np.exp(-x**2) + 0.1 * rng.standard_normal(50) >>> plt.plot(x, y, 'ro', ms=5)
使用平滑参数的默认值
>>> spl = UnivariateSpline(x, y) >>> xs = np.linspace(-3, 3, 1000) >>> plt.plot(xs, spl(xs), 'g', lw=3)
手动更改平滑量
>>> spl.set_smoothing_factor(0.5) >>> plt.plot(xs, spl(xs), 'b', lw=3) >>> plt.show()