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,) 类似数组
独立输入数据的一维数组。必须递增;如果 s 为 0,则必须严格递增。
- y(N,) 类似数组
因变量输入数据的一维数组,与 x 的长度相同。
- w(N,) 类似数组,可选
样条拟合的权重。必须为正数。如果 w 为 None,则所有权重均为 1。默认为 None。
- bbox(2,) 类似数组,可选
指定近似区间边界的 2 个序列。如果 bbox 为 None,则
bbox=[x[0], x[-1]]
。默认为 None。- kint,可选
平滑样条的次数。必须为 1 <= k <= 5。
k = 3
是三次样条。默认为 3。- sfloat 或 None,可选
用于选择结点数的正平滑因子。结点数将增加,直到满足平滑条件
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 的标准差的倒数,则在范围 (m-sqrt(2*m),m+sqrt(2*m)) 中应该可以找到一个好的 s 值,其中 m 是 x、y 和 w 中的数据点数。这意味着如果1/w[i]
是y[i]
的标准差的估计值,则s = len(w)
应该是一个好值。- extint 或 str,可选
控制不在结点序列定义的区间中的元素的推断模式。
如果 ext=0 或 'extrapolate',则返回推断值。
如果 ext=1 或 'zeros',则返回 0
如果 ext=2 或 'raise',则引发 ValueError
如果 ext=3 或 'const',则返回边界值。
默认为 0。
- check_finitebool,可选
是否检查输入数组是否仅包含有限数字。禁用可能会提高性能,但如果输入包含无穷大或 NaN,可能会导致问题(崩溃、非终止或无意义的结果)。默认为 False。
另请参阅
BivariateSpline
二元样条的基础类。
SmoothBivariateSpline
通过给定点的平滑二元样条
LSQBivariateSpline
使用加权最小二乘拟合的二元样条
RectSphereBivariateSpline
在球面上矩形网格上的二元样条
SmoothSphereBivariateSpline
在球坐标中的平滑二元样条
LSQSphereBivariateSpline
使用加权最小二乘拟合的球坐标中的二元样条
RectBivariateSpline
在矩形网格上的二元样条
InterpolatedUnivariateSpline
用于给定的一组数据点的插值一元样条。
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
(只要相应的权重为零,精确值并不重要。)参考资料
[1]P. Dierckx,“使用样条函数平滑、微分和积分实验数据的算法”,J.Comp.Appl.Maths 1 (1975) 165-184。
[2]P. Dierckx,“一种在矩形网格上平滑数据同时使用样条函数的快速算法”,SIAM J.Numer.Anal. 19 (1982) 1286-1304。
[3]P. Dierckx,“一种改进的样条函数曲线拟合算法”,report tw54, Dept. Computer Science,K.U. Leuven, 1981。
[4]P. Dierckx,“使用样条的曲线和曲面拟合”,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()
方法
__call__
(x[, nu, ext])在位置 x 处计算样条(或其 nu 阶导数)。
antiderivative
([n])构造一个新的样条,表示此样条的逆导数。
derivative
([n])构造一个新的样条,表示此样条的导数。
derivatives
(x)返回点 x 处样条的所有导数。
返回样条系数。
返回样条内部结点的位置。
返回样条近似的平方残差的加权和。
integral
(a, b)返回给定两点之间样条曲线的定积分。
roots
()返回样条曲线的零点。
使用给定的平滑因子 s 和上次调用时找到的节点继续样条计算。
validate_input