SciPy - 插值
在本章中,我们将讨论插值在 SciPy 中如何发挥作用。
什么是插值?
插值是在直线或曲线上的两点之间查找值的过程。为了帮助我们记住它的含义,我们应该将单词“inter”的第一部分视为“输入”,它提醒我们查看我们最初拥有的数据的“内部”。插值这个工具不仅在统计中有用,而且在科学、商业或需要预测两个现有数据点内的值时也很有用。
让我们创建一些数据,看看如何使用scipy.interpolate包完成这种插值。
import numpy as np from scipy import interpolate import matplotlib.pyplot as plt x = np.linspace(0, 4, 12) y = np.cos(x**2/3+4) print x,y
上述程序将生成以下输出。
( array([0., 0.36363636, 0.72727273, 1.09090909, 1.45454545, 1.81818182, 2.18181818, 2.54545455, 2.90909091, 3.27272727, 3.63636364, 4.]), array([-0.65364362, -0.61966189, -0.51077021, -0.31047698, -0.00715476, 0.37976236, 0.76715099, 0.99239518, 0.85886263, 0.27994201, -0.52586509, -0.99582185]) )
现在,我们有两个数组。假设这两个数组是空间中点的二维,让我们使用以下程序进行绘图,看看它们是什么样子的。
plt.plot(x, y,’o’) plt.show()
上述程序将生成以下输出。
一维插值
scipy.interpolate 中的 interp1d 类是一种基于固定数据点创建函数的便捷方法,可以使用线性插值在给定数据定义的域内的任何位置对其进行评估。
通过使用上述数据,我们创建一个插值函数并绘制一个新的插值图。
f1 = interp1d(x, y,kind = 'linear') f2 = interp1d(x, y, kind = 'cubic')
使用 interp1d 函数,我们创建了两个函数 f1 和 f2。这些函数对于给定的输入 x 返回 y。第三个变量 kind 表示插值技术的类型。“线性”、“最近”、“零”、“线性”、“二次”、“三次”是插值的几种技术。
现在,让我们创建一个更长的新输入,以查看插值的明显差异。我们将在新数据上使用旧数据的相同功能。
xnew = np.linspace(0, 4,30) plt.plot(x, y, 'o', xnew, f(xnew), '-', xnew, f2(xnew), '--') plt.legend(['data', 'linear', 'cubic','nearest'], loc = 'best') plt.show()
上述程序将生成以下输出。
样条曲线
为了通过数据点绘制平滑的曲线,绘图人员曾经使用称为机械样条的柔性细木条、硬橡胶、金属或塑料条。为了使用机械花键,将销钉放置在设计中沿曲线明智选择的点上,然后弯曲花键,使其接触每个销钉。
显然,通过这种结构,样条曲线在这些引脚处对曲线进行插值。它可以用来重现其他图纸中的曲线。销钉所在的点称为结。我们可以通过调整结的位置来改变样条定义的曲线的形状。
单变量样条
一维平滑样条拟合一组给定的数据点。scipy.interpolate 中的 UnivariateSpline 类是基于固定数据点类创建函数的便捷方法 - scipy.interpolate.UnivariateSpline(x, y, w = None, bbox = [None, None], k = 3, s = 无,ext = 0,check_finite = False)。
参数- 以下是单变量样条的参数。
这将 k 次样条 y = spl(x) 拟合到提供的 x, y 数据。
'w' - 指定样条拟合的权重。必须是积极的。如果没有(默认),则权重全部相等。
's' - 通过指定平滑条件来指定结数。
'k' - 平滑样条的次数。必须 <= 5。默认值为 k = 3,三次样条。
Ext - 控制不在结序列定义的间隔内的元素的外推模式。
如果 ext = 0 或“外推”,则返回外推值。
如果 ext = 1 或“零”,则返回 0
如果 ext = 2 或 'raise',则引发 ValueError
如果 ext = 3 of 'const',则返回边界值。
check_finite – 是否检查输入数组是否仅包含有限数字。
让我们考虑下面的例子。
import matplotlib.pyplot as plt from scipy.interpolate import UnivariateSpline x = np.linspace(-3, 3, 50) y = np.exp(-x**2) + 0.1 * np.random.randn(50) plt.plot(x, y, 'ro', ms = 5) plt.show()
使用平滑参数的默认值。
spl = UnivariateSpline(x, y) xs = np.linspace(-3, 3, 1000) plt.plot(xs, spl(xs), 'g', lw = 3) plt.show()
手动更改平滑量。
spl.set_smoothing_factor(0.5) plt.plot(xs, spl(xs), 'b', lw = 3) plt.show()