常用的插值法有:
一維插值法:拉格朗日插值斩跌、牛頓插值、分段低次插值捞慌、埃爾米特插值耀鸦、樣條插值。
二維插值法:雙線性插值啸澡、雙二次插值袖订。
拉格朗日插值法
https://zh.wikipedia.org/wiki/%E6%8B%89%E6%A0%BC%E6%9C%97%E6%97%A5%E6%8F%92%E5%80%BC%E6%B3%95
優(yōu)點與缺點:
拉格朗日插值法的公式結(jié)構(gòu)整齊緊湊,在理論分析中十分方便嗅虏,然而在計算中洛姑,當插值點增加或減少一個時,所對應的基本多項式就需要全部重新計算皮服,于是整個公式都會變化楞艾,非常繁瑣[5]参咙。這時可以用重心拉格朗日插值法或牛頓插值法來代替。此外产徊,當插值點比較多的時候昂勒,拉格朗日插值多項式的次數(shù)可能會很高蜀细,因此具有數(shù)值不穩(wěn)定的特點舟铜,也就是說盡管在已知的幾個點取到給定的數(shù)值,但在附近卻會和“實際上”的值之間有很大的偏差(如右下圖)[6]奠衔。這類現(xiàn)象也被稱為龍格現(xiàn)象谆刨,解決的辦法是分段用較低次數(shù)的插值多項式。
Python實現(xiàn):
from scipy.interpolate import lagrange #導入拉格朗日插值函數(shù)
inputfile = '/Users/xiaoyi.yang/Downloads/missing_data.xls' #輸入數(shù)據(jù)路徑,需要使用Excel格式归斤;
outputfile = '/Users/xiaoyi.yang/Downloads/missing_data_processed.xls' #輸出數(shù)據(jù)路徑,需要使用Excel格式
data = pd.read_excel(inputfile, header=None) #讀入數(shù)據(jù)
data
#自定義列向量插值函數(shù)
#s為列向量痊夭,n為被插值的位置,k為取前后的數(shù)據(jù)個數(shù)脏里,默認為5
def ployinterp_column(s, n, k=5):
y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))] #取數(shù)
y = y[y.notnull()] #剔除空值
return lagrange(y.index, list(y))(n) #插值并返回插值結(jié)果
#逐個元素判斷是否需要插值
for i in data.columns:
for j in range(len(data)):
if (data[i].isnull())[j]: #如果為空即插值她我。
data[i][j] = ployinterp_column(data[i], j)
data.to_excel(outputfile, header=None, index=False) #輸出結(jié)果`