拉格朗日插值

重点

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

解决问题

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

f ( x ) = j = 0 N y i f i ( x ) ,其中

f i ( x ) = j i N x x j x i x j

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

  • f i ( x ) 是一个 ( N 1 ) 阶函数

  • 在已知的N个点中
    f i ( x ) = 1   i f   x = x i
    f i ( x ) = 0   i f   x x i

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

例子

给定三个点 ( x 1 , y 1 ) , ( x 2 , y 2 ) , ( x 3 , y 3 ) , 则
f ( x ) = j = 0 3 y i f i ( x ) = y 1 f 1 ( x ) + y 2 f 2 ( x ) + y 3 f 3 ( x ) ,其中

f 1 ( x ) = x x 2 x 1 x 2 × x x 3 x 1 x 3

f 2 ( x ) = x x 1 x 2 x 1 × x x 3 x 2 x 3

f 3 ( x ) = x x 1 x 3 x 1 × x x 2 x 3 x 2

代码

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 = x 3 是三阶曲线,但只给出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()

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

猜你喜欢

转载自blog.csdn.net/z0n1l2/article/details/80740747