SciPy 教程-SciPy 插值
插值被定义为在直线或曲线上两点之间找到一个值。单词的第一部分 "inter" 意味着 "进入",这提示我们要查看数据内部。换句话说,"在精确数据点之间估计中间值称为插值"。在统计学、科学和商业中,或者当需要预测存在于两个现有数据点之间的值时,插值非常有用。
让我们看看如何使用 scipy.interpolation 包进行插值。
import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
x = np.linspace(0, 5, 10)
y = np.cos(x**2/3+4)
print(x,y)
这将以数组形式给出以下输出。np.linspace() 函数返回给定数字之间的间隔。
输出:
[0. 0.55555556 1.11111111 1.66666667 2.22222222 2.77777778
3.33333333 3.88888889 4.44444444 5.]
[-0.65364362 -0.57246439 -0.29634775 0.21191783 0.80382736 0.95857746
0.14971294 -0.92731369 -0.39972072 0.97296947]
我们可以将这些数组作为空间中两点的二维绘制,考虑以下示例:
import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
x = np.linspace(0, 5, 10)
y = np.cos(x**2/3+4)
plt.plot(x,y,'r')
plt.show()
输出:
一维插值
scipy.interpolation 提供 interp1d 类,这是一种基于固定数据点创建函数的有用方法。
通过使用上述数据,创建一个插值函数并绘制一个新的插值图。
import numpy as np
from scipy.interpolate import interp1d
import matplotlib.pyplot as plt
fun1 = interp1d(x, y,kind = 'linear')
fun2 = interp1d(x, y, kind = 'cubic')
xnew = np.linspace(0, 4,30)
plt.plot(x, y, 'o', xnew, fun1(xnew), '-', xnew, fun2(xnew), '--')
plt.legend(['data', 'linear', 'cubic','nearest'], loc = 'best')
plt.show()
输出:
在上述程序中,我们创建了两个函数 fun1 和 fun2。变量 x 包含样本点,变量 y 包含相应的值。第三个变量 kind 表示插值技术的类型。有多种插值方法。这些方法包括:
- 线性
- 最近邻
- 零
- S-线性
- 二次
- 三次
样条
样条是用于通过指定的一组点生成平滑曲线的柔性带。样条插值需要两个基本步骤。在第一步中,计算曲线的样条表示;在第二步中,在所需点评估样条。
有两种方法表示曲线。首先,直接样条方法使用函数 splrep() 在二维平面上找到曲线的样条表示。默认的样条顺序是三次的,但可以通过输入关键字 k 进行更改。
splprep() 允许我们在 N 维空间中 参数化 定义曲线。关键字参数用于指定在样条拟合期间执行的平滑量。
标准输出是一个三元组 (t, c, k),其中 t 表示结点,c 表示系数,k 表示样条的阶。
单变量样条
scipy.interpolate 提供 UnivariateSpline 类,这是一种基于固定数据点创建函数的合适方法。语法如下:
scipy.interpolate.UnivariateSpline(x, y, w = None, bbox = [None, None], k = 3, s = None, ext = 0, check_finite = False).
参数-
w- 指定用于样条拟合的权重。必须是正的。
s- 通过指定平滑条件来指定结点(点)的数量。
k- 表示平滑样条的度数。必须满足 k <= 5。默认情况下,k = 3,即三次样条。
Ext
- 控制由结点序列定义的间隔外元素的外推模式。
- 如果 ext = 0 或 'extrapolate',返回外推值。
- 如果 ext = 1 或 'zero',返回 0
- 如果 ext = 2 或 'raise',引发 ValueError
- 如果 ext = 3 或 'const',返回边界值。
- check_finite - 检查输入数组是否只包含有限数。
考虑以下示例:
import matplotlib.pyplot as plt
import numpy as np
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()
输出: