本文简要介绍 python 语言中 scipy.interpolate.UnivariateSpline
的用法。
用法:
class scipy.interpolate.UnivariateSpline(x, y, w=None, bbox=[None, None], k=3, s=None, ext=0, check_finite=False)#
一维平滑样条拟合到一组给定的数据点。
将 k 次的样条 y = spl(x) 拟合到提供的 x, y 数据。 s 通过指定平滑条件来指定节数。
- x: (N,) 数组
独立输入数据的一维数组。必须增加;如果 s 为 0,则必须严格递增。
- y: (N,) 数组
与 x 长度相同的相关输入数据的一维数组。
- w: (N,) 数组, 可选
样条拟合的权重。必须是正的。如果w为None,则权重均为1。默认为None。
- bbox: (2,) 类数组,可选
2-sequence 指定近似区间的边界。如果盒子是无,
bbox=[x[0], x[-1]]
.默认为无。- k: 整数,可选
平滑样条的度数。必须是 1 <=k<= 5。
k = 3
是三次样条。默认值为 3。- s: 浮点数或无,可选
用于选择结数的正平滑因子。节点数将增加,直到满足平滑条件:
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是无,s将被设置为长度(宽)用于使用所有数据点的平滑样条。如果为 0,样条曲线将通过所有数据点进行插值。这相当于scipy.interpolate.InterpolatedUnivariateSpline。默认为“无”。用户可以使用s控制贴合的紧密度和平滑度之间的权衡。较大s意味着更平滑,而较小的值s表示平滑度较低。的推荐值s取决于权重,w。如果权重代表标准差的倒数y,那么一个好的s值应在 (m-sqrt(2*m),m+sqrt(2*m)) 范围内找到,其中 m 是数据点的数量x,y, 和w。这意味着
s = len(w)
应该是一个很好的值,如果1/w[i]
是标准差的估计值y[i]
.- ext: int 或 str,可选
控制不在节点序列定义的区间内的元素的外推模式。
如果 ext=0 或 ‘extrapolate’,则返回外推值。
如果 ext=1 或 ‘zeros’,返回 0
如果 ext=2 或‘raise’,则引发ValueError
如果 ext=3 或‘const’,则返回边界值。
默认值为 0。
- check_finite: 布尔型,可选
是否检查输入数组是否仅包含有限数。禁用可能会提高性能,但如果输入确实包含无穷大或 NaN,则可能会导致问题(崩溃、非终止或无意义的结果)。默认为假。
参数 ::
注意:
数据点的数量必须大于样条度 k。
NaN 处理:如果输入数组包含
nan
值,结果没有用,因为底层的样条拟合例程无法处理nan
.一种解决方法是对not-a-number 数据点使用零权重:>>> 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]、[2]、[3] 和 [4] 中说明的算法:
[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,“用样条函数进行曲线拟合的改进算法”,报告 tw54,计算机科学系,K.U.鲁汶,1981 年。
[4]P. Dierckx,“用样条拟合曲线和曲面”,数值分析专着,牛津大学出版社,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()
相关用法
- Python SciPy interpolate.make_interp_spline用法及代码示例
- Python SciPy interpolate.krogh_interpolate用法及代码示例
- Python SciPy interpolate.InterpolatedUnivariateSpline用法及代码示例
- Python SciPy interpolate.BSpline用法及代码示例
- Python SciPy interpolate.LSQSphereBivariateSpline用法及代码示例
- Python SciPy interpolate.griddata用法及代码示例
- Python SciPy interpolate.splder用法及代码示例
- Python SciPy interpolate.LinearNDInterpolator用法及代码示例
- Python SciPy interpolate.PPoly用法及代码示例
- Python SciPy interpolate.NdBSpline用法及代码示例
- Python SciPy interpolate.pade用法及代码示例
- Python SciPy interpolate.barycentric_interpolate用法及代码示例
- Python SciPy interpolate.RegularGridInterpolator用法及代码示例
- Python SciPy interpolate.NdPPoly用法及代码示例
- Python SciPy interpolate.interp2d用法及代码示例
- Python SciPy interpolate.approximate_taylor_polynomial用法及代码示例
- Python SciPy interpolate.RectSphereBivariateSpline用法及代码示例
- Python SciPy interpolate.sproot用法及代码示例
- Python SciPy interpolate.splantider用法及代码示例
- Python SciPy interpolate.CloughTocher2DInterpolator用法及代码示例
- Python SciPy interpolate.interp1d用法及代码示例
- Python SciPy interpolate.BPoly用法及代码示例
- Python SciPy interpolate.BarycentricInterpolator用法及代码示例
- Python SciPy interpolate.splrep用法及代码示例
- Python SciPy interpolate.make_smoothing_spline用法及代码示例
注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.interpolate.UnivariateSpline。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。