一般在數(shù)據(jù)處理的過程中,會遇到缺失值的情況,對于缺失值的處理一般會刪除或者插值補充。其中拉格朗日插值就是一種最簡單的插值方法。本文主要涉及兩個內(nèi)容
1、拉格朗日插值的數(shù)學(xué)理論
2、Python實現(xiàn)拉格朗日插值
1、拉格朗日插值
對于所取得的n個樣本數(shù)據(jù)(xi, yi)(其中n=1,2,...,n),滿足的n次多項式,然后計算多項式在興趣點的值,把這種方法叫做拉格朗日插值,其實就是解方程組。對于有n個數(shù)據(jù)樣本,需要n-1次多項式函數(shù),將n個數(shù)據(jù)帶入函數(shù)中,得到n元一次的方程組,解出方程組就能得到函數(shù)。于是就能計算你感興趣的x對應(yīng)的y值了。
n-1次多項式函數(shù)為

將n個樣本數(shù)據(jù)帶入以上方程中得到:

其中:



方程的解的問題就轉(zhuǎn)化為矩陣X是否可逆,如果可逆那么方程就有解。而解的個數(shù)取決于X的秩,如果X的秩為n有唯一解,X的秩小于n,方程就有無數(shù)個解。
2、Python實現(xiàn)拉格朗日插值
只需要導(dǎo)入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):
# 調(diào)用拉格朗日插值,得到插值函數(shù)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
# 構(gòu)造樣本數(shù)據(jù)
x = np.linspace(0, 20, NUMBER)
y = np.linspace(2, 14, NUMBER) + eps
# 興趣點數(shù)據(jù)
xx = np.linspace(12, 15, 10)
interp_lagrange(x, y, xx)

注意
1、很多人可能覺得樣本數(shù)據(jù)越多,得到的插值數(shù)據(jù)會越精確,這樣想法是不正確的。理論上說,樣本數(shù)據(jù)過多,得到的插值函數(shù)的次數(shù)就越高,插值的結(jié)果的誤差可能會更大。拉格朗日插值的穩(wěn)定性不太好,出現(xiàn)不穩(wěn)定的現(xiàn)象稱為龍格現(xiàn)象,解決的辦法就是分段用較低次數(shù)的插值多項式。
2、插值一般采用內(nèi)插法,也就是只計算樣本點內(nèi)部的數(shù)據(jù)。