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

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

插值

1-D插值

scipy.interpolate中的interp1d类是一种基于固定数据点创建函数的便捷方法,可以使用线性插值在给定数据定义的域内的任何位置进行求值.

通过使用上述数据,让我们创建一个插值函数并绘制一个新的插值图.

f1 = interp1d(x, y,kind = 'linear')

f2 = interp1d(x, y, kind = 'cubic')

使用interp1d函数,我们创建了两个函数f1和f2.对于给定的输入x,这些函数返回y.第三种变量类型表示插值技术的类型. '线性','最近','零','Slinear','二次','立方'是一些插值技术.

现在,让我们创建一个新的输入更多长度看插值的明显差异.我们将在新数据上使用旧数据的相同功能.

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

样条

为了通过数据点绘制平滑的曲线,起草人曾使用过薄的柔性木条,硬橡胶,金属或塑料称为机械样条.为了使用机械花键,将销钉放置在设计中沿曲线的明智选择点上,然后弯曲花键,使其接触每个销钉.

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

单变量样条

一维平滑样条拟合一组给定的数据点. 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',则返回0

    • 如果ext = 2或'raise',则引发ValueError

    • 如果ext = 3'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()

使用默认值平滑参数的值.

S plines

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