SciPy 插值


在本章中,我们将讨论插值如何在 SciPy 中发挥作用。

什么是插值?


插值是在直线或曲线上的两点之间找到值的过程。为了帮助我们记住它的含义,我们应该将单词的第一部分“inter”视为“进入”的意思,它提醒我们“深入”我们最初拥有的数据。这个工具,插值,不仅在统计中有用,而且在科学、商业或需要预测两个现有数据点内的值时也很有用。

让我们创建一些数据,看看如何使用 scipy.interpolate package.

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()

上述程序将生成以下输出。

Interpolation

一维插值


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()

上述程序将生成以下输出。

1-D Interpolation

Splines


为了通过数据点绘制平滑曲线,绘图员曾经使用称为机械样条的薄木条、硬橡胶、金属或塑料条。为了使用机械样条,将销放置在设计中沿曲线的明智选择的点上,然后将样条弯曲,使其接触这些销中的每一个。

显然,通过这种结构,样条曲线在这些引脚处插入曲线。它可以用来重现其他图纸中的曲线。销所在的点称为结。我们可以通过调整节点的位置来改变由样条曲线定义的曲线的形状。

单变量样条

一维平滑样条拟合一组给定的数据点。 scipy.interpolate 中的 UnivariateSpline 类是基于固定数据点类创建函数的便捷方法 – scipy.interpolate.UnivariateSpline(x, y, w = None, bbox = [None, None], k = 3, s = 无,分机 = 0,check_finite = 假)。

参数 : 以下是单变量样条的参数。

  • 这将 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()

使用平滑参数的默认值。

Splines
spl = UnivariateSpline(x, y)
xs = np.linspace(-3, 3, 1000)
plt.plot(xs, spl(xs), 'g', lw = 3)
plt.show()

手动更改平滑量。

Splines Smoothing
spl.set_smoothing_factor(0.5)
plt.plot(xs, spl(xs), 'b', lw = 3)
plt.show()
Splines Smoothing