SciPy 插值
什么是插值?
插值是一种在给定点之间生成点的方法。
例如:对于点 1 和 2,我们可以进行插值并找到点 1.33 和 1.66。
插值有许多用途,在机器学习中,我们经常处理数据集中的缺失数据,插值经常用于替代这些值。
这种填充值的方法称为插补。
除了插补之外,插值还经常用于需要平滑数据集中的离散点的情况。
如何在 SciPy 中实现它?
SciPy 为我们提供了一个名为 scipy.interpolate
的模块,其中包含许多用于处理插值的函数:
一维插值
函数 interp1d()
用于对具有 1 个变量的分布进行插值。
它接受 x
和 y
点,并返回一个可调用函数,该函数可以用新的 x
调用并返回相应的 y
。
实例
对于给定的 xs 和 ys,从 2.1、2.2... 到 2.9 插值:
from scipy.interpolate import interp1d import numpy as np xs = np.arange(10) ys = 2*xs + 1 interp_func = interp1d(xs, ys) newarr = interp_func(np.arange(2.1, 3, 0.1)) print(newarr)
结果:
[5.2 5.4 5.6 5.8 6. 6.2 6.4 6.6 6.8]
注意:新的 xs 应该与旧的 xs 处于相同的范围内,这意味着我们不能使用大于 10 或小于 0 的值调用 interp_func()
。
样条插值
在一维插值中,点被拟合为单条曲线,而在样条插值中,点被拟合为使用样条定义的分段函数。样条是由多项式定义的。
UnivariateSpline()
函数接受 xs
和 ys
,并生成一个可调用函数,该函数可以用新的 xs
调用。
分段函数(Piecewise function):对于不同范围有不同定义的函数。
实例
对于以下非线性点,求 2.1、2.2...2.9 的单变量样条插值:
from scipy.interpolate import UnivariateSpline import numpy as np xs = np.arange(10) ys = xs**2 + np.sin(xs) + 1 interp_func = UnivariateSpline(xs, ys) newarr = interp_func(np.arange(2.1, 3, 0.1)) print(newarr)
结果:
[5.62826474 6.03987348 6.47131994 6.92265019 7.3939103 7.88514634 8.39640439 8.92773053 9.47917082]
使用径向基函数的插值
径向基函数是对应于固定参考点定义的函数。
Rbf()
函数也接受 xs
和 ys
作为参数,并生成一个可调用函数,该函数可以用新的 xs
调用。
实例
使用 rbf 对以下 xs 和 ys 进行插值并求 2.1、2.2 ... 2.9 的值:
from scipy.interpolate import Rbf import numpy as np xs = np.arange(10) ys = xs**2 + np.sin(xs) + 1 interp_func = Rbf(xs, ys) newarr = interp_func(np.arange(2.1, 3, 0.1)) print(newarr)
结果:
[6.25748981 6.62190817 7.00310702 7.40121814 7.8161443 8.24773402 8.69590519 9.16070828 9.64233874]