插值算法讲解

常见插值算法概览

我开发了一个halo渲染插件,通过这个小知识点来测试一下效果,顺道用于当备忘录

插值算法本质上和预测类型算法属于同一类,但是插值一般是用于光滑曲线或者异常数据处理(包括异常值/空值)。异常数据处理在数据预处理阶段,不过一般都用于时间序列/图像这种相邻数据关系很大的,一般的异常值处理更多的是剔除。

交互式插值图

直接拖动红色采样点,下面会实时重算插值曲线。这里把插件的 HTML + CSS + JS 渲染方式用在教学图里:页面结构由 HTML 描述,图像由 SVG 绘制,交互和数值计算都由原生 JavaScript 完成。

说明:拉格朗日和牛顿会得到同一条全局多项式;分段线性强调局部稳定;三次样条会给出更平滑的曲线。 克里金法和双线性插值更偏二维/空间场景,这一张图先聚焦在一维插值的实时演示。

拉格朗日插值

拉格朗日插值适合在一组离散节点 \( (x_0,y_0), (x_1,y_1), \dots, (x_n,y_n) \) 上,直接构造一个穿过所有点的多项式。它的核心思想是:给每个采样点构造一个“只在自己位置取 1,在其他节点取 0”的基函数。

最终插值多项式写成:

\[ P_n(x) = \sum_{i=0}^{n} y_i L_i(x), \qquad L_i(x)=\prod_{j=0,j\ne i}^{n}\frac{x-x_j}{x_i-x_j} \]

优点是公式直接、推导清晰,适合教学和小规模计算;缺点是点一多就容易数值不稳定,而且每次新增节点都要把整个多项式重算一遍。并且还会出现龙格现象,所以一般是不使用的。

直观理解:它是在“全局”上用一个高次多项式拟合所有点,所以局部加一点、整体都会动。

牛顿插值

牛顿插值同样构造一条通过所有采样点的多项式,但它把多项式写成逐项累加的形式,配合差商表后,增量更新很方便。

标准形式为:

\[ P_n(x)=f[x_0]+f[x_0,x_1](x-x_0)+f[x_0,x_1,x_2](x-x_0)(x-x_1)+\cdots \]

其中 \(f[x_0,x_1,\dots,x_k]\)差商。差商可以递推计算:

\[ f[x_i,x_{i+1},\dots,x_{i+k}] = \frac{f[x_{i+1},\dots,x_{i+k}] - f[x_i,\dots,x_{i+k-1}]} {x_{i+k} - x_i} \]

它和拉格朗日插值得到的是同一个插值多项式,只是表达方式不同。真正的优势在于可扩展:如果新加一个节点,只需补一列差商,不需要完全重建。同上存在龙格现象,并且计算量大,一般不使用。

分段线性插值

分段线性插值不再追求用一条高次曲线穿过所有点,而是把相邻两个节点之间用一条直线连接起来。它是最简单、最稳妥的局部插值方法之一。听上去很厉害就是用相临两个点预测中间的点,不过线性插值是最常用的,因为简单稳定且计算量小。

\(x \in [x_i, x_{i+1}]\) 时,插值公式是:

\[ P(x)=y_i+\frac{y_{i+1}-y_i}{x_{i+1}-x_i}(x-x_i) \]

  • 优点:简单、快、稳定,对数据噪声不过分敏感。
  • 缺点:拐点明显,一阶导数不连续,曲线看起来比较“折”。
在工程里,如果你更在意稳健和可解释性,而不是高光滑度,分段线性插值往往是一个很好的默认选择。

三次样条插值

三次样条插值是在每个区间上用一个三次多项式,但同时要求整条曲线在节点处足够平滑,通常要求函数值、一阶导数、二阶导数都连续。主要用于需要光滑曲线的场景(比如用于路径计算可以保证也就是加速度连续),具体求解方法通过三对角方程组,运算速度较快经常使用。

每段可以写成:

\[ S_i(x)=a_i+b_i(x-x_i)+c_i(x-x_i)^2+d_i(x-x_i)^3,\qquad x\in[x_i,x_{i+1}] \]

再结合端点条件(自然边界、夹持边界、周期边界等)求出所有系数。

三次样条比“全局高次多项式”更稳,又比分段线性更平滑,所以在曲线绘制、数值分析、轨迹生成里非常常见。

你可以把它理解成:既想贴合数据,又不想让曲线在节点处突然折一下,因此用“局部三次 + 全局平滑约束”来折中。

二维插值法

二维插值在一些栅格数据或者图像数据里面常用,比如GIS。

克里金法

克里金法(Kriging)是地统计学里非常经典的一种空间插值方法,它不仅给出预测值,还给出预测误差估计。和前面的纯几何/代数插值不同,它会显式利用样本之间的空间相关性。最小化估计误差方差的无偏估计。(要保证符合地理学第一定律)

其基本形式可写成加权和:

\[ \hat{Z}(x_0)=\sum_{i=1}^{n}\lambda_i Z(x_i) \]

权重 \(\lambda_i\) 不是随便定的,而是通过协方差函数或半变异函数来求,使得估计无偏、方差最小。

  • 优点:适合空间数据,能量化不确定性。
  • 缺点:需要建立变异函数模型,计算量通常更大。
如果你的数据带有明显的空间位置属性,比如地质、气象、环境监测、土壤样本,克里金法通常比简单距离加权更强。

双线性插值

双线性插值是二维网格上的常用方法,尤其常见于图像缩放、纹理采样和栅格数据重采样。它可以看作先沿一个方向做线性插值,再沿另一个方向做一次线性插值。在图像处理领域常用,比如要求输入为64x64但是实际输入的是32x32使用这个方法进行扩展图片然后输入。深度学习的图像处理也经常用这个算法通过随机缩放图片来用于做数据集增强,增强图像模型的鲁棒性。

设四个角点分别为 \(Q_{11}, Q_{12}, Q_{21}, Q_{22}\), 那么点 \((x,y)\) 的估计值为:

\[ f(x,y)\approx \frac{ \begin{aligned} & f(Q_{11})(x_2-x)(y_2-y) + f(Q_{21})(x-x_1)(y_2-y) \\ & \quad + f(Q_{12})(x_2-x)(y-y_1) + f(Q_{22})(x-x_1)(y-y_1) \end{aligned} }{(x_2-x_1)(y_2-y_1)} \]

它比最近邻插值更平滑,但比双三次插值更轻量,因此在实时图形和图像处理中非常常用。