一個簡單的例子學明白用Python插值

2020-12-14 高效工作的方法

這篇文章嘗試通過一個簡單的例子來為讀者講明白怎樣使用Python實現數據插值。總共分3部分來介紹:

為什麼需要做插值這種事?通過拉格朗日插值法來看看插值這個事的理論要怎麼理解?Python實現拉格朗日插值的一個例子。為什麼需要做插值這種事?

這個答案很簡單,無非兩條:

首先,這個點上它沒有數據或者數據不能用:(1)沒採集到這個點上的數據;(2)採集到這個點上的數據了,但是數據明顯是錯誤的。

其次,如果這個點上它沒有數據的話呢,會對我們的建立的數據模型產生不好的影響,我們不得不想辦法在這個缺失的點上給它想辦法插上一個數據。

這個事,有點像下面這個桶桶,它少一個板就沒法用,那我們想辦法再找一個板板給它插到原來的地方,雖然可能沒有原裝的板板那麼美觀好看,但好歹這個桶桶它能用了呀。

那我們又不是神仙,怎樣知道不存在數據的那個點上它的數據是個什麼鬼呢?好在世間萬物都不是孤立存在的,都會存在或多或少的聯繫,說的直白一點我們就靠這些聯繫來把這個缺少的值給猜出來。

還是以上面那個桶為例,我們要插入的多高多長的板子才能保證桶子盛的水最多且不漏出來呢?我們可以量一量缺少的那個板子它前後的板子的高度,然後取這兩個高度的中間值作為插入的板子的高度,或者用整個桶的板子的平均高度,還有什麼眾數啊、固定值啊什麼的能整的都可以整。

或者我們定義一個看上去比較NB的算法公式來確定這個板子的高度,比如用回歸方法、拉格朗日插值法。那接下來我們一起看看拉格朗日插值,它其實也是一個非常簡單的事。

通過拉格朗日插值法來看看插值這個事的理論要怎麼理解?

我覺得用外國數學家的人名來命名一些方法、數學定理什麼的是一件非常cd的事情,這極大的提高了我們中國學生的學習門檻,讓很多簡單的不能再簡單的數學問題看上去那麼高深莫測。好比我們說歐幾裡得空間,聽著挺高大上的,讓人望而生畏,其實它也就是種向量空間而已。

同樣的,拉格朗日插值法實質上就是一種多項式插值法。而多項式插值法說的是,如果有n個點,每個點都有個x值對應的y值。那就必然能找到一個n-1次多項式使得這n個點的(x,y)值代入這個多項式成立。最簡單的,好比說平面坐標上的兩個點,必然能找的一個1次的式子y=kx+b滿足這兩個點的坐標值,更直白一點說,平面坐標上兩點決定了一條直線。

那麼,如果我們手上有n+1個點,但是只有其中n個點的(x,y)值,有一個點呢只知道它的x值,不知道它的y值。如果我們能找到滿足已知的n個點的n-1次多項式(即插值公式),那我們就可以用這個多項式來算剩下的一個點的y值了。

拉格朗日先生呢,找到一種操作性比較強的辦法確定這個多項式,所以我們把這個辦法叫做拉格朗日插值法。

關於這個公式確定辦法我會另外寫文章講,這裡不再重複。

而且,對於實際工程應用來說,其實只要能夠知道插值的思想,然後知道插值函數的調用方法即可,不需要記這些複雜的公式,畢竟我們主要目標是解決問題而不是去做數學家。

下面通過一個例子來說明Python進行數據插值的一般步驟。

Python實現拉格朗日插值的一個例子。

我們以後面參考資料中的一組數據為例來說明,需要數據源的朋友可以留言或私信我。

這組數據呢,是一個餐廳某段時間內的銷量情況。數據源在excel中,我們使用pandas的read_excel方法將它讀出來,放到一個dataframe中。實現代碼如下:

importpandasaspdfromscipy.interpolateimportlagrange#導入拉格朗日插值函數importmatplotlib.pyplotasplt"""讀Excel文件"""inputfile='../data/catering_sale.xls'#注意數據源excel文件的存放路徑data=pd.read_excel(inputfile)然後呢,我們粗暴地假設這些銷量中小於400或者大於5000的都是異常值,把它們置為空。

data[u'銷量'][(data[u'銷量']<400)|(data[u'銷量']>5000)]=None#過濾異常值,將其變為空Nonedata_original=data.copy()#我們把原始數據保存一下當然這個上下限400、5000,我們可以使用箱型圖法等一些數據分布分析的辦法來確定。

下面的代碼就是對預設的值進行插值了,你看其實代碼很少。我們來分析一下。

前面這個ployinterp_column函數,是我們定義的插值函數,真正插值的操作是在後面的那兩個嵌套的for循環中。

#定義列向量的插值函數defployinterp_column(s,n,k=4):y=s[list(range(n-k,n))+list(range(n+1,n+1+k))]#取一部分輸入參數的值y=y[y.notnull()]#空值剔除掉returnlagrange(y.index,list(y))(n)foriindata.columns:forjinrange(len(data)):if(data[i].isnull())[j]:#如果為空data[i][j]=ployinterp_column(data[i],j)上面代碼外層的for循環中,for i in data.columns,是對data的每一列進行遍歷,實質上我們這裡只有兩列,而且我們只需要對銷量數據進行插值,所以我們這層可以省略。改成下面這個樣子效果也是一樣的:

forjinrange(len(data)):if(data[u'銷量'].isnull())[j]:#如果為空data[u'銷量'][j]=ployinterp_column(data[u'銷量'],j)我們遍歷「銷量」這一列,如果某個單元上為空,我們就調用ployinterp_column函數來對它進行插值。

注意到這個插值函數有3個參數,一個是我們要插值的整個列s,另一個是這列中為空的那個單元格的坐標n,還有一個k是我們取的整列中控制坐標n附近的幾個值來進行插值(這裡默認為4)。

插值前後的dataframe的比較如下圖所示,我們在原來nan的位置上都自動的插入了一個值,而且這個值看上去還挺像那麼回事的。

插值前後的對比python裡面實現拉格朗日插值很簡單,直接調用scipy.interpolate裡面的lagrange函數即可,但是需要注意的是我們在ployinterp_column函數中對k的取值的選擇,k不宜取值過大或過小,過大的話會出現所謂的龍格現象。如下面兩個圖所示,k分別取4和5之後插值的效果,取5時有一個值時-70000多,明顯是一個錯誤的。

k取4時的插值結果

k取5時的插值結果所以,k的取值會影響插值的效果,而k具體取什麼值合適,一般都是通過經驗反覆嘗試幾次來確定。

參考資料:

張良均等著,《Python與數據挖掘實踐》

相關焦點

  • 木蘭重生:與 Python 生態的兼容問題;字符串插值 - OSCHINA - 中文...
    前兩天用木蘭調用 pygame 庫實現了個井字棋棋盤界面。期間遇到了一些問題,先小結一下。1 生態兼容問題註:解決方法限於個人至今對木蘭和 Python 的了解。如有高招,煩請指教!幸好與 python 相似,函數返回多項時就會打包成元組,因此暫時這樣定義函數:func 多項2(a, b) { return a, b}func 多項3(a, b, c) { return a, b, c}...之後支持變長參數時,就可以合併為一個函數了。
  • python推薦 | 面向地學領域的Python庫匯總
    這是一篇告訴你如何更好的使用Python來解決地學領域問題的文章。數據處理•NetCDF格式 : netCDF4-python,h5py,h5netcdf,xarray等。除了上述簡單的數據處理庫之外,python還提供了NCO和CDO工具的封裝,pynco和cdo,提供了更多的便捷操作。
  • 一文講解圖像插值算法原理!附Python實現
    缺點由最鄰近插值法,放大後的圖像有很嚴重的馬賽克,會出現明顯的塊狀效應;縮小後的圖像有很嚴重的失真。這是一種最基本、最簡單的圖像縮放方式。變換後的每個像素點的像素值,只由原圖像中的一個像素點確定。例如上面,點(0,0.75)的像素只由(0,1)確定,這樣的效果顯然不好。點(0,0.75)的像素不止和(0,1)有關,和(0,0)也有關,只是(0,1)的影響更大。
  • 一個go和python有趣的例子
    今天在一博文中看到一個有趣的問題,分享給大家,曾經也通過自學學習過python程式語言,python是一門很簡煉、功能豐富的語言,目前已大量用於科學研究和網際網路開發各個領域
  • 拉格朗日插值定理的理論基礎
    常用的方法有:上圖表中的均值、中位數、眾數、固定值什麼的都比較好理解,看上去比較高大上的一個是回歸方法,另一個就是插值法。回歸方法,我們後面另外起文討論。插值法裡面常用的就是拉格朗日插值、牛頓插值兩類,我們重點看看拉格朗日插值法。拉格朗日插值,是一種多項式插值,那多項式插值定理怎麼一回事呢?
  • Python 腳本案例:為流域插值雨量計
    PCSWMM對IronPython的即開即用支持(版本2.7.8)免去了用戶在安裝PCSWMM之後再進行任何額外配置或設置的麻煩。用戶可以在腳本編輯器中直接創建、管理和執行腳本,並提供腳本示例來幫助您入門。通過提供對所有GIS、模型和時間序列數據的直接訪問(從PCSWMM7.2版本開始,將支持所有任何格式的數據導入!及導出到任意格式,處理任意的結果分析!)
  • 為什麼大家都推薦你學python?看完這5個例子就明白了!
    為什麼大家都推薦你學Python?而不是C語言或者是JAVA呢?因為——python很靈活,一定程度上函數也可以傳參和注入,所以代碼的靈活性要大的多。python自帶了函數的curry化以及遲滯運算方式,以及閉包語法更容易實現,所以在一定層面上python還是比java難掌控的。python擁有的duck typing屬性,作為動態語言專有的特性,python可以讓對象擺脫靜態語言範式的約束,隨意的給程序打補丁,所以程序擴展性更好。
  • Python-plotnine 核密度空間插值可視化繪製
    從本期開始,我會陸續推出系列空間插值的推文教程,包括常見的「Kriging(克裡金插值法)、Nearest Neighbor(最近鄰點插值法)、Polynomial Regression(多元回歸法)、Radial Basis Function(徑向基函數法)」 等多種空間插值方法,探索空間可視化帶給我們的視覺魅力
  • Python-Plotnine包: 類別插值地圖
    今天這篇推文,我們繼續空間數據可視化的最後一個系列-類別插值(categorical-spatial-interpolation) 可視化繪製的推文教程,這期我們使用Python進行繪製,涉及的知識點如下:sklearn.KNeighborsClassifier()機器學習應用
  • Python下opencv使用筆記(一:簡單操作與幾何變換)
    圖像簡單讀取、顯示與儲存首先關於python想說的是,單純的官網下載的python並不大,是一個最初的python,進行一些簡單的操作時可以的,但是當你進行複雜一點的時候,就需要許多第三方的安裝包,比如numpy等等,這些庫安裝進去說起來也不是很複雜,網上有很多教程,但是當許多的包安裝的時候,有的庫包並沒有你的電腦的版本,等等還有許多因素導致你的庫包安裝不進去,想想還是挺麻煩的
  • Python趣味打怪:60秒學會一個例子,147段代碼助你從入門到大師
    入門簡單如十進位轉二進位,盡顯Python簡潔之美:In [1]: bin(10)Out[1]: '0b1010'冬天到了,就算沒有點亮手繪技能,也能用簡單幾行代碼繪出漫天雪花:python 機器學習,包括機器學習的基礎概念和十大核心算法以及Sklearn和Kaggle實戰的小例子PyQt製作GUIFlask前端開發Python數據分析:NumPy, Pandas, Matplotlib, Plotly等教程開篇,先用82段簡單易懂的代碼,介紹了Python的基礎語法、功能。
  • 慢步學python,編程基礎,字符串類型例子及輸出
    簡單來說,字符串就是「字符」。字符串在python中的形式它們可以用單引號(『…』)或雙引號(「…」)括起來。因為這裡由單引號開始,python會將第2個單引號理解為字符串的結束。在單引號字符串想要顯示單引號,慢步用轉義字符\ 反斜槓 才成功輸出。轉義字符\ 的作用就是在特殊字符前使用,可以實現特殊的顯示功能。第二次錯誤提示的是「異常的縮進」,因為慢步在複製代碼時print前面多複製了一個空格。
  • 三氯化六氨合鈷綜合實驗的python自動化作圖方法
    本學期的有機實驗終於過去,終於可以好好鼓搗一下python能大顯身手的實驗了,前面幾個分析和生化實驗也沒啥好作圖的,不過無機和物化裡面用到線性擬合圖像以及其他圖像的地方還是非常多總之,所有的」origin作圖「,理論上全都可以用python代替,origin的優勢在於拿起就能做,而python的優勢在於一勞永逸1.
  • 最鄰近插值&&雙線性內插值!
    寫在最前:用最簡單的方式,講述最深刻的知識。pic1. 小朋友像素陣列!圖像縮放,即在佔據相同空間(D1=D2=7)的情況下,用5個(隨便舉的例子)小朋友實現排列,那麼每個小朋友所佔的空間大小就發生了變化:d2=D2/5=1.4。這樣看來,每個小朋友都應該變胖了一些才對,請看下圖:
  • 學python能找到女朋友嗎(python基礎教程)
    編者按:學習python近兩年,談談我對於python的一點小理解,也從一些方面談談自己微薄的想法,本文會介紹如何學習Python。實現一個微型的HTTP服務程序來說是很簡單的事情,在Python下,只需要一個命令行,為了提高大家的編程效率,那就趕快關注本文吧!
  • 【python勸退指南】小學數學老師喊你回來用python學代數!
    相信各位看一眼應該就已經知道了答案,那麼接下來我們用python來求解這道題        看上去是不是很簡單,這就是python語言的魅力。除了用 * 號代替了 乘號,其餘部分完完全全都是代數的內容。我們可以停下來翻譯一下,把它變成我們熟悉的語言:        回到代碼中去,我們來進一步解析代碼的含義。
  • 基於Python等語言的Kriging、IDW空間插值對比分析
    猶記得研三那年,中山大學某博士建議我棄用Matlab,轉戰R語言和Python。故本文將對Matlab的地圖白化絕口不提,畢竟當年我真的沒搞明白如何利用m_map工具箱。1 我的m_map學習成果:註:我未能學到精髓,不敢班門弄斧耍大刀。
  • 插值
    簡單解釋就是根據已知點(xi)構造出一個最佳函數,對於一些新點(x)計算出對應的函數(y)值。      註:本篇就談一下多項式插值,對其他插值方法感興趣的小夥伴後臺回復「插值」獲取資源。二.多項式插值    所謂的多項式插值就是利用n個數據點構造一個n-1次多項式。
  • Python科學計算入門書籍推薦
    話說回來,這近些日子,隨著機器學習的熱潮,python也算是程序界的蒂花之秀了,幾乎到處都能看到它的聲影。算下來,我也有「幾乎4年」的python開發時間了,期間還使用python來參加全國研究生數學建模比賽並連續兩年拿到了國二。都說python入門簡單,網上也有很多學習資源。但是大多數都比較亂,沒有一個明確的順序和方向。
  • 如何使用python完成數學建模常見算法
    在數學建模中主流的程式語言是MATLAB,但隨著python/R中數學軟體包的不斷完善,熟悉這兩種程式語言的同學也可以快速數學建模的編程環節。後面我們將介紹幾種常見數學建模算法的python實現,旨在展示python在本領域的強大威力。