拉格朗日插值

博客介绍了拉格朗日插值在数据清洗中的应用,它可用于填充缺失数据。给定N个点求取满足特定条件的函数f(x),拉格朗日插值给出了相应解的形式及性质。还通过例子展示其计算方式,并用代码测试不同点数和噪声情况下的拟合效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

重点

  • 拉格朗日插值可以用来填充缺失的数据,数据清洗中的一步

解决问题

给定NN个点(xi,yi),求取函数f(x)f(x), 满足f(xi)=yif(xi)=yi. 利用这种插值方法,可以填充缺失的数据.
拉格朗日插值对上述问题的给出的解有如下形式:

f(x)=Nj=0yifi(x)f(x)=∑j=0Nyifi(x),其中

fi(x)=Njixxjxixjfi(x)=∏j≠iNx−xjxi−xj

拉格朗日插值有如下性质:

  • fi(x)fi(x)是一个(N1)(N−1)阶函数

  • 在已知的N个点中
    fi(x)=1 if x=xifi(x)=1 if x=xi
    fi(x)=0 if xxifi(x)=0 if x≠xi

  • 根据上面的结果,插值函数f(x)f(x)满足 f(xi)=yif(xi)=yi for i[0,N1]i∈[0,N−1] (这就是插值的目标)

例子

给定三个点(x1,y1),(x2,y2),(x3,y3)(x1,y1),(x2,y2),(x3,y3), 则
f(x)=3j=0yifi(x)=y1f1(x)+y2f2(x)+y3f3(x)f(x)=∑j=03yifi(x)=y1f1(x)+y2f2(x)+y3f3(x),其中

f1(x)=xx2x1x2×xx3x1x3f1(x)=x−x2x1−x2×x−x3x1−x3

f2(x)=xx1x2x1×xx3x2x3f2(x)=x−x1x2−x1×x−x3x2−x3

f3(x)=xx1x3x1×xx2x3x2f3(x)=x−x1x3−x1×x−x2x3−x2

代码

scipy.interpolate.lagrange可以完成拉格朗日插值

已知点的数目加一比目标函数的阶数小

from scipy.interpolate import lagrange
import numpy as np
from matplotlib import pyplot as plt
x = np.array([0, 1, 2])
y = x**3
poly = lagrange(x, y)


x = np.arange(-5,5)
y = x ** 3
predy = poly(x)

plt.plot(x,y,label='groundtruth',color='r')
plt.plot(x,predy,label='predicted',color='y')
plt.legend()
plt.show()

结果图
这里写图片描述
可以看出拟合效果很差,因为目标函数y=x3y=x3是三阶曲线,但只给出3个点,拉格朗日插值只能生成一个二阶曲线,必然无法拟合

已知点的数目加一等于目标函数的阶数

from scipy.interpolate import lagrange
import numpy as np
from matplotlib import pyplot as plt
x = np.array([0, 1, 2,3])
y = x**3
poly = lagrange(x, y)


x = np.arange(-5,5)
y = x ** 3
predy = poly(x)

plt.plot(x,y,label='groundtruth',color='r')
plt.plot(x,predy,label='predicted',color='y')
plt.legend()
plt.show()

这里写图片描述
给定四个点就可以完美拟合三阶曲线

已知点的数目加一大于目标函数的阶数

from scipy.interpolate import lagrange
import numpy as np
from matplotlib import pyplot as plt
x = np.array([0, 1, 2,3,4])
y = x**3
poly = lagrange(x, y)


x = np.arange(-5,5)
y = x ** 3
predy = poly(x)

plt.plot(x,y,label='groundtruth',color='r')
plt.plot(x,predy,label='predicted',color='y')
plt.legend()
plt.show()

这里写图片描述
给定五个点也可以完美拟合三阶曲线

已知点的数目加一大于目标函数的阶数,但存在噪声

from scipy.interpolate import lagrange
import numpy as np
from matplotlib import pyplot as plt
x = np.array([0, 1, 2,3,4])
y = x**3
y[-1] -= 5 #噪声
poly = lagrange(x, y)


x = np.arange(-5,5)
y = x ** 3
predy = poly(x)

plt.plot(x,y,label='groundtruth',color='r')
plt.plot(x,predy,label='predicted',color='y')
plt.legend()
plt.show()

这里写图片描述
噪声导致拟合误差增大,也是合理的结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值