SciPy 插值

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 - 插值

一维插值

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 - 插值

Splines

为了通过数据点画出平滑的曲线,起草者曾经使用过被称为机械花键的木头、硬橡胶、金属或塑料的柔性薄条。为了使用机械花键,在设计中沿着曲线明智地选择一些点,然后将花键弯曲,使其接触到每一个针。

很明显,在这种结构下,花键在这些针脚处插补了曲线。它可以被用来在其他图纸上重现曲线。销钉所在的点被称为结点。我们可以通过调整结点的位置来改变花键所定义的曲线的形状。

单变量Spline

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

参数 - 以下是单变量样条曲线的参数。

  • 这是对所提供的x,y数据拟合一个k度的花键y = spl(x)。

  • ‘w’ – 指定花键拟合的权重。必须是正数。如果没有(默认),权重都是相等的。

  • ‘s’ – 通过指定一个平滑条件来指定结的数量。

  • ‘k’ – 平滑花键的程度。必须是<=5。默认的是k=3,一个立方花键。

  • Ext – 控制不在结点序列所定义的区间内的元素的外推模式。

    • 如果ext = 0或’外推’,返回外推值。

    • 如果ext = 1或’零’,返回0

    • 如果ext = 2或’raise’,引发一个ValueError。

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

使用平滑参数的默认值。

SciPy - 插值

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

手动改变平滑的数量。

SciPy - 插值

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

SciPy - 插值

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程