技术背景
2024年诺贝尔物理学奖和化学奖的揭幕,正式宣告了科学界对AI时代的认可,人工智能正在全方位的改变人类社会各种场景的互作模式,而数据拟合以及误差与算力的控制,则是大多数人工智能工作者所关注的重点。与数据拟合的思想不同的是,传统的数值计算中人们更倾向于使用多项式进行精确的参数计算,这种方法叫做插值。当然,插值算法的精确是相对于边界条件而言的,随着点数的变化,不同的插值算法有不同的余项。现在在模型训练中,因为数据点本身就是有误差的,所以强行使用插值算法会导致过拟合的现象。只有在一些传统的对精度要求较高的计算场景中,保留了插值算法的应用。
线性插值
给定两个点:(x1,y1),(x2,y2),其插值出来的线性函数为:
f(x)=y2−y1x2−x1x+y1−y2−y1x2−x1x1=y2−y1x2−x1x+y2−y2−y1x2−x1x2
稍微改写一下形式有:
f(x)=(x2−xx2−x1)y1+(x−x1x2−x1)y2
可以得到f(x1)=y1,f(x2)=y2。
二次插值
给定三个点:(x1,y1),(x2,y2),(x3,y3),假设其插值函数为:f(x)=ax2+bx+c,那么可以根据三个点联立方程组,写成矩阵形式就是:
⎛⎜
⎜⎝x21x11x22x21x23x31⎞⎟
⎟⎠⎛⎜⎝abc⎞⎟⎠=⎛⎜⎝y1y2y3⎞⎟⎠
所以求解系数a,b,c变成了一个矩阵求逆问题,可以手动做一个初等变换:
⎛⎜
⎜⎝x21x11100x22x21010x23x31001⎞⎟
⎟⎠→⎛⎜
⎜
⎜
⎜⎝11x11x211x210011x21x2201x22011x31x23001x23⎞⎟
⎟
⎟
⎟⎠→⎛⎜
⎜
⎜
⎜
⎜
⎜⎝11x11x211x21000x1−x2x1x2x21−x22x21x22−1x211x2200x1−x3x1x3x21−x23x21x23−1x2101x23⎞⎟
⎟
⎟
⎟
⎟
⎟⎠→⎛⎜
⎜
⎜
⎜
⎜⎝11x11x211x21000x1−x2x1x2x21−x22x21x22−1x211x2200x1−x2x1x2(x1+x3)(x1−x2)x21x2x3−x3(x1−x2)x21x2(x1−x3)0x1−x2x2x3(x1−x3)⎞⎟
⎟
⎟
⎟
⎟⎠→⎛⎜
⎜
⎜
⎜
⎜⎝11x11x211x21000x1−x2x1x2x21−x22x21x22−1x211x22000(x1−x2)(x2−x3)x1x22x3x2−x3x1x2(x1−x3)−1x22x1−x2x2x3(x1−x3)⎞⎟
⎟
⎟
⎟
⎟⎠→⎛⎜
⎜
⎜
⎜⎝11x11x211x210001x1+x2x1x2−x2x1(x1−x2)x1x2(x1−x2)0001x2x3(x1−x2)(x1−x3)−x1x3(x1−x2)(x2−x3)x1x2(x1−x3)(x2−x3)⎞⎟
⎟
⎟
⎟⎠→⎛⎜
⎜
⎜
⎜⎝11x11x211x2100010−x2+x3(x1−x2)(x1−x3)x1+x3(x1−x2)(x2−x3)−x1+x2(x1−x3)(x2−x3)001x2x3(x1−x2)(x1−x3)−x1x3(x1−x2)(x2−x3)x1x2(x1−x3)(x2−x3)⎞⎟
⎟
⎟
⎟⎠→⎛⎜
⎜
⎜
⎜⎝1001(x1−x2)(x1−x3)−1(x1−x2)(x2−x3)1(x1−x3)(x2−x3)010−x2+x3(x1−x2)(x1−x3)x1+x3(x1−x2)(x2−x3)−x1+x2(x1−x3)(x2−x3)001x2x3(x1−x2)(x1−x3)−x1x3(x1−x2)(x2−x3)x1x2(x1−x3)(x2−x3)⎞⎟
⎟
⎟
⎟⎠
也就是说,最终的逆矩阵为:
⎛⎜
⎜
⎜
⎜⎝1(x1−x2)(x1−x3)−1(x1−x2)(x2−x3)1(x1−x3)(x2−x3)−x2+x3(x1−x2)(x1−x3)x1+x3(x1−x2)(x2−x3)−x1+x2(x1−x3)(x2−x3)x2x3(x1−x2)(x1−x3)−x1x3(x1−x2)(x2−x3)x1x2(x1−x3)(x2−x3)⎞⎟
⎟
⎟
⎟⎠
可以验证:
⎛⎜
⎜⎝x21x11x22x21x23x31⎞⎟
⎟⎠⎛⎜
⎜
⎜
⎜⎝1(x1−x2)(x1−x3)−1(x1−x2)(x2−x3)1(x1−x3)(x2−x3)−x2+x3(x1−x2)(x1−x3)x1+x3(x1−x2)(x2−x3)−x1+x2(x1−x3)(x2−x3)x2x3(x1−x2)(x1−x3)−x1x3(x1−x2)(x2−x3)x1x2(x1−x3)(x2−x3)⎞⎟
⎟
⎟
⎟⎠=⎛⎜⎝100010001⎞⎟⎠
有了逆矩阵,就可以计算参数数值a,b,c,那么这里我们直接写出函数形式:
f(x)=(x−x2)(x−x3)(x1−x2)(x1−x3)y1+(x−x1)(x−x3)(x2−x1)(x2−x3)y2+(x−x1)(x−x2)(x3−x1)(x3−x2)y3
拉格朗日插值法
观察前面线性插值和二次插值的函数规律,可以给出一个推广形式:
f(x)=N∑i=1ci(x,x1,x2,...,xN)yN
其中系数函数ci(x,x1,x2,...,xN)=∏i−1j=1x−xjxi−xj∏Nk=i+1x−xkxi−xk。可以给出N个数据点的N−1次插值函数解析式,这就是拉格朗日插值法,满足f(xi)=yi的约束条件。
牛顿插值法
如果把线性插值中的函数表达式再修改一下形式,变成:
f(x)=y1+y2−y1x2−x1(x−x1)
类似的,二阶插值函数可以改成如下形式:
f(x)=y1+y2−y1x2−x1(x−x1)+y3−y2x3−x2−y2−y1x2−x1x3−x1(x−x1)(x−x2)
如果定义一个一阶差商为:
g(xi,xi+1)=yi+1−yixi+1−xi
其含义为(xi,xi+1)区间内的平均变化率。有了一阶差商的定义,就可以递归的定义二阶差商:
g(xi,xi+1,xi+2)=g(xi+1,xi+2)−g(xi,xi+1)xi+2−xi
以及m阶的差商:
g(xi,xi+1,xi+2,...,xi+m)=g(xi+1,xi+2,...,xi+m)−g(xi,xi+1,...,xi+m−1)xi+m−xi
则可以写出牛顿插值的函数形式为:
f(x)=y1+N−1∑i=1g(x1,...,xi+1)i∏j=1(x−xj)
插值形式对比
拉格朗日插值算法和牛顿插值算法,插值的阶数是一致的,同样的点数插值出来的多项式也是唯一的,换句话说两个方法插值出来的函数其实是等价的。那么两个插值算法的优劣势在哪里?我们考虑这么一种情况,原本有N个数据点需要插值,此时如果再引入一个新的数据点,总点数变成了N+1。此时如果使用的是拉格朗日插值法,那么就需要我们把所有的系数全都再算一遍。而如果使用的是牛顿插值法,那么我们发现前面的N个系数是不需要发生变化的,我们只需要再计算一个新的系数即可,极大程度上的减少了点数更新所带来的参数计算量。但也并不是说拉格朗日插值没有用武之地,在现如今的张量计算时代,拉格朗日插值法的每一项系数都是同Shape的张量操作,反而是牛顿插值的递归形式在张量计算中会有一些麻烦。
总结概要
本文通过线性插值和二次插值的形式,介绍了拉格朗日插值算法以及牛顿插值算法的基本形式。两种插值算法的最终函数形式是一致的,但是在不同场景下的参数求解计算量是不一致的,需要根据自己的应用场景选择更加合适的插值算法。
版权声明
本文首发链接为:https://www.cnblogs.com/dechinphy/p/lg-interp.html
作者ID:DechinPhy
更多原著文章:https://www.cnblogs.com/dechinphy/
请博主喝咖啡:https://www.cnblogs.com/dechinphy/gallery/image/379634.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步