對現(xiàn)有數(shù)據(jù)進(jìn)行擬合或插值是數(shù)學(xué)分析中常見的方式。
通過分析現(xiàn)有數(shù)據(jù),得到一個(gè)連續(xù)的函數(shù)(也就是曲線);或者更密集的離散方程與已知數(shù)據(jù)互相吻合,這個(gè)過程叫做擬合。
通過已知的、離散的數(shù)據(jù)點(diǎn),在范圍內(nèi)推求新數(shù)據(jù)點(diǎn)的過程或方法則叫做插值
簡單來說,插值與擬合最大的區(qū)別就是,插值所獲得的曲線一定要通過數(shù)據(jù)點(diǎn),而擬合需要的是總體上最接近的結(jié)果。
所以說要實(shí)現(xiàn)插值算法,我們的目標(biāo)是通過給定的x值和y值,創(chuàng)建一個(gè)函數(shù)y=f(x),可以在該函數(shù)中插入想要的任何值a并獲得相應(yīng)的值y=f(a)。
例如給定x=[0:5:5],y=x^2,在python中畫出散點(diǎn)圖為
import numpy as np
import matplotlib.pyplot as plt
x_data = np.linspace(0,5,5)
y_data = x_data**2
plt.scatter(x_data,y_data)
plt.show()
假如我們想獲取x=2的值,可以看到圖中沒有對應(yīng)的數(shù)據(jù)點(diǎn),因此無法直接獲得,所以需要用到插值,而最簡單的插值方式為線性插值,就是通過直線連接數(shù)據(jù)點(diǎn)。
這樣通過scipy.interpolate.interp1d()的函數(shù)即可進(jìn)行一維插值。
from scipy.interpolate import interp1d
x_data = np.linspace(0,5,5)
y_data = x_data**2
y_f = interp1d(x_data, y_data, 'linear')
print(y_f(2))
通過上述代碼使用線性插值,運(yùn)行代碼后求出x=2時(shí)y的值為4.375,由于線性插值是通過相鄰兩點(diǎn)的連線來進(jìn)行插值,無法考慮到其他數(shù)據(jù)點(diǎn),我們都知道x=2時(shí)y=x^2的值為4,這里的插值結(jié)果明顯有問題。
于是使用2次多項(xiàng)式的方式進(jìn)行插值,可以得到y(tǒng)(2)=4
y_f = interp1d(x_data, y_data,'quadratic')
x = np.linspace(0,5,100)
y = y_f(x)
plt.plot(x,y,'--')
plt.show()
print(y_f(2))
上述案例的數(shù)據(jù)較為簡單,我們可以輕易地判斷插值后的數(shù)據(jù)是否準(zhǔn)確,但是對于復(fù)雜的數(shù)據(jù),選擇合適的插值方式就變得十分重要。
聯(lián)系客服