Numpy 插值
什么是Numpy
Numpy是Python中一个重要的科学计算库,它提供了高性能的多维数组与维度数组对象,以及提供操作这些数组的函数。Numpy中最重要的功能是向量化操作,它允许用户直接对整个数组执行数学运算或其他操作。在数据科学中,Numpy是进行数据结构与数据处理的必备工具之一。
阅读更多:Numpy 教程
插值(Interpolation)
在数学与计算机科学中,插值指的是根据已知的一些数据点,通过某种方法推算出在这些数据点之间的未知数据点的值。插值可以对一些难以或无法测量的物理量进行预测或估计。
Python中scipy库提供了插值的工具,但是在实际使用中,我们通常需要对不规则的数据点进行插值,而numpy的interpolate模块提供了一些方法既能实现内插法(interpolation),也可以完成外推法(extrapolation)。
Numpy的插值方法主要分为以下四种:
1. 线性插值(Linear Interpolation)
线性插值就是通过已知的数据点绘制一条直线,猜测其位置其它点的值。例如,在二维坐标系中,我们可以用通过已知的两个点(x_1,y_1)、(x_2,y_2)重为例,建立一条两点的直线:
y = \frac{y_2-y_1}{x_2-x_1}(x-x_1)+y_1
代码实现:
def linear_interpolate(x_known: np.ndarray, y_known: np.ndarray, x_new: np.ndarray) -> np.ndarray:
# 直线斜率
k = (y_known[1] - y_known[0]) / (x_known[1] - x_known[0])
# 直线截距
b = y_known[0] - k * x_known[0]
# 返回插值结果
return k * x_new + b
线性插值仅适用于数据较为规则的情况,对于不规则的数据点的插值效果不佳。
2. 多项式插值(Polynomial Interpolation)
多项式插值是通过已知的数据点拟合出一个高次多项式,从而预测其它数据点的值。
对于已知部分数据点(x_i,y_i),以及需要插值的点(x_0,y_0),多项式插值得到的预测函数可表示为:
f(x) = a_0 + a_1(x-x_1)+a_2(x-x_1)(x-x_2)+…+a_n(x-x_1)(x-x_2)…(x-x_n)
需要求的各项系数a_i可通过构造矩阵与向量的方式求解。
多项式插值可以处理的数据点数量较多,但是会存在牛顿插值与拉格朗日插值结果波动的问题。
代码实现:
def poly_interpolate(x_known: np.ndarray, y_known: np.ndarray, x_new: np.ndarray, order: int) -> np.ndarray:
# 计算插值处的加权矩阵
X = np.zeros(shape=(len(x_known), order + 1))
for i in range(len(x_known)):
for j in range(order + 1):
X[i][j] = np.power(x_known[i], j)
theta = np.linalg.solve(X, y_known)
# 计算插值处的预测值
y_new = np.zeros(shape=(len(x_new),))
for i in range(len(x_new)):
for j in range(order + 1):
y_new[i] += theta[j] * np.power(x_new[i], j)
return y_new
3. 样条插值(Spline Interpolation)
样条插值是通过在已知数据点之间拟合一个连续的函数,从而预测其它数据点的值。样条插值的优点在于它在各个数据点的一阶导数值相等、二阶导数连续的条件下,插值函数有最小的弯曲程度,同时其确定系数较多可优化插值效果。
使用numpy进行样条插值:
import numpy as np
from scipy.interpolate import InterpolatedUnivariateSpline
# 构造不规则数据点
x_known = np.linspace(0, 10, 500)
y_known = np.sin(x_known)
x_irr = np.sort(np.random.choice(x_known, 20, replace=False))
y_irr = np.sin(x_irr)
# 使用样条插值
spline = InterpolatedUnivariateSpline(x_irr, y_irr)
x_new = np.linspace(0, 10, 1000)
y_new = spline(x_new)
4. Kriging插值(Kriging Interpolation)
Kriging插值是一种统计学模型,它可以通过以半方差函数为基础描述样本点之间的空间自相关性,预测未知位置的数值信息。在Kriging插值中,数据点的位置不仅是插值的关键,而且数据点之间的距离与方向也起着非常重要的作用。
使用Krigin插值需要安装GeoPandas扩展包以及PyKrige库。
!pip install geopandas
!pip install pykrige
import numpy as np
import geopandas as gpd
from pykrige.ok import OrdinaryKriging
# 读取数据
data = gpd.read_file('path/to/points.shp')
x = data['x'].values
y = data['y'].values
z = data['z'].values
# 建立Kriging模型
OK = OrdinaryKriging(x, y, z)
# 用于预测的数据点位置
x_new = np.linspace(x.min(), x.max(), 1000)
y_new = np.linspace(y.min(), y.max(), 1000)
# 预测结果
z_new, _ = OK.execute('grid', x_new, y_new)
总结
插值是一种根据已知数据点预测未知数据点的方法,Numpy提供了多种插值的模块与方法。线性插值适用于规则的数据点,多项式插值可以处理更多的数据点,但存在问题;样条插值是一种弯曲程度小、优化系数多的插值方法;Kriging插值是一种广泛应用于地理空间数据分析的插值方法,需要地理信息扩展包以及专业的插值库的支持。根据不同的数据特点以及需求,选择不同的插值方法可以优化插值效果与精度。