SciPy 插值

什么是插值?

插值是一种在给定点之间生成点的方法。

例如:对于点 1 和 2,我们可以插值并找到点 1.33 和 1.66。

插值有很多用途,在 机器学习 中,我们经常处理数据集中缺失的数据,插值通常用于替换这些值。

这种填充值的方法称为 插补

除了插补外,在需要平滑数据集中的离散点时,通常使用插值。


如何在 SciPy 中插值?

SciPy 提供给我们一个叫做 scipy.interpolate 的模块,它包含很多可以用来做插值的方法:


一维插值

函数 interp1d() 可以进行一维数据的插值运算。

该方法接收两个参数 x 点和 y 点。

返回值是可调用函数,该函数可以用新的 x 调用并返回相应的 y,y = f(x)

实例

对于给定的 xs 和 ys 插值,从 2.1、2.2。。。至 2.9:

  1. from scipy.interpolate import interp1d
  2. import numpy as np
  3. xs = np.arange(10)
  4. ys = 2*xs + 1
  5. interp_func = interp1d(xs, ys)
  6. newarr = interp_func(np.arange(2.1, 3, 0.1))
  7. print(newarr)
结果:
  1. [5.2 5.4 5.6 5.8 6. 6.2 6.4 6.6 6.8]
注意:新的 xs 应该和旧的 xs 在相同的范围内,这意味着我们不能用大于 10 或小于 0 的值调用 interp_func()

单变量插值

在一维插值中,点是针对单个曲线拟合的,而在样条插值中,点是针对使用多项式分段定义的函数拟合的。

单变量插值使用 UnivariateSpline() 函数,该函数接受 xsys 并生成一个可调用函数,该函数可以用新的 xs 调用。

分段函数:对不同范围有不同定义的函数。

实例

为以下非线性点查找 2.1, 2.2… 2.9 的单变量插值:

  1. from scipy.interpolate import UnivariateSpline
  2. import numpy as np
  3. xs = np.arange(10)
  4. ys = xs**2 + np.sin(xs) + 1
  5. interp_func = UnivariateSpline(xs, ys)
  6. newarr = interp_func(np.arange(2.1, 3, 0.1))
  7. print(newarr)
结果:
  1. [5.62826474 6.03987348 6.47131994 6.92265019 7.3939103 7.88514634 8.39640439 8.92773053 9.47917082]

径向基函数插值

径向基函数是一个取值仅仅依赖于离原点距离的实值函数。

Rbf() 函数接受 xsys 作为参数,并生成一个可调用函数,该函数可以用新的 xs 调用。

实例

使用 rbf 带入 xs 和 ys 为 2.1, 2.2 … 2.9 查找插值

  1. from scipy.interpolate import Rbf
  2. import numpy as np
  3. xs = np.arange(10)
  4. ys = xs**2 + np.sin(xs) + 1
  5. interp_func = Rbf(xs, ys)
  6. newarr = interp_func(np.arange(2.1, 3, 0.1))
  7. print(newarr)
结果:
  1. [6.25748981 6.62190817 7.00310702 7.40121814 7.8161443 8.24773402 8.69590519 9.16070828 9.64233874]