重点
- 拉格朗日插值可以用来填充缺失的数据,数据清洗中的一步
解决问题
给定
个点
,求取函数
, 满足
. 利用这种插值方法,可以填充缺失的数据.
拉格朗日插值对上述问题的给出的解有如下形式:
,其中
拉格朗日插值有如下性质:
是一个 阶函数
在已知的N个点中
根据上面的结果,插值函数 满足 for (这就是插值的目标)
例子
给定三个点
, 则
,其中
代码
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()
结果图
可以看出拟合效果很差,因为目标函数
是三阶曲线,但只给出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()
噪声导致拟合误差增大,也是合理的结果