📅  最后修改于: 2020-11-05 04:32:41             🧑  作者: Mango
在本章中,我们将讨论内插如何在SciPy中提供帮助。
插值是在直线或曲线上的两个点之间找到值的过程。为了帮助我们记住它的含义,我们应该将“ inter”一词的第一部分理解为“ enter”(输入),它使我们想起在原始数据的“内部”。这种插值工具不仅在统计中有用,而且在科学,商业或需要预测两个现有数据点之内的值时也有用。
让我们创建一些数据,看看如何使用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。第三变量种类代表插值技术的类型。 “线性”,“最近”,“零”,“线性”,“二次方”,“三次方”是一些插值技术。
现在,让我们创建一个更长的新输入,以了解插值的明显区别。我们将在新数据上使用旧数据的相同函数。
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或’extrapolate’,则返回外推值。
如果ext = 1或“零”,则返回0
如果ext = 2或’raise’,则引发ValueError
如果ext =’const’的3,则返回边界值。
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()