一般在数据处理的过程中,会遇到缺失值的情况,对于缺失值的处理一般会删除或者插值补充。其中拉格朗日插值就是一种最简单的插值方法。本文主要涉及两个内容
1、拉格朗日插值的数学理论
2、Python实现拉格朗日插值
1、拉格朗日插值
对于所取得的n个样本数据(xi, yi)(其中n=1,2,...,n)
,满足的n次多项式,然后计算多项式在兴趣点的值,把这种方法叫做拉格朗日插值,其实就是解方程组。对于有n个数据样本,需要n-1次多项式函数,将n个数据带入函数中,得到n元一次的方程组,解出方程组就能得到函数。于是就能计算你感兴趣的x对应的y值了。
n-1次多项式函数为
![](http://www.forkosh.com/mathtex.cgi? \large y=\sum_{i=0}{n-1}a_ixi)
将n个样本数据带入以上方程中得到:
![](http://www.forkosh.com/mathtex.cgi? \large \mathbf{Y}=\mathbf{XA})
其中:
方程的解的问题就转化为矩阵X是否可逆,如果可逆那么方程就有解。而解的个数取决于X的秩,如果X的秩为n有唯一解,X的秩小于n,方程就有无数个解。
2、Python实现拉格朗日插值
只需要导入scipy.interpolate
的lagrange
方法
# -*- coding:utf-8 -*-
from scipy.interpolate import lagrange
import numpy as np
import matplotlib.pyplot as plt
def interp_lagrange(x, y, xx):
# 调用拉格朗日插值,得到插值函数p
p = lagrange(x, y)
yy = p(xx)
plt.plot(x, y, "b*")
plt.plot(xx, yy, "ro")
plt.show()
if __name__ == '__main__':
NUMBER = 20
eps = np.random.rand(NUMBER) * 2
# 构造样本数据
x = np.linspace(0, 20, NUMBER)
y = np.linspace(2, 14, NUMBER) + eps
# 兴趣点数据
xx = np.linspace(12, 15, 10)
interp_lagrange(x, y, xx)
注意
1、很多人可能觉得样本数据越多,得到的插值数据会越精确,这样想法是不正确的。理论上说,样本数据过多,得到的插值函数的次数就越高,插值的结果的误差可能会更大。拉格朗日插值的稳定性不太好,出现不稳定的现象称为龙格现象,解决的办法就是分段用较低次数的插值多项式。
2、插值一般采用内插法,也就是只计算样本点内部的数据。