上一篇文章講了最小二乘算法的原理。這篇文章通過一個簡單的例子來看如何通過Python實現最小乘法的線性回歸模型的參數估計。
王松桂老師《線性統計模型——線性回歸與方差分析》一書中例3.1.3。
說的是一個實驗容器靠蒸汽供應熱量,使其保持恆溫,通過一段時間觀測,得到下圖表中的這樣一組數據:
蒸汽-環境溫度數據其中,自變量X表示容器周圍空氣單位時間的平均溫度(℃),Y表示單位時間內消耗的蒸汽量(L),共觀測了25個單位時間(表中序號一列)。
那麼,我們要怎樣對這組數據進行線性回歸分析呢?一般分三步:(1)畫散點圖,找模型;(2)進行回歸模型的參數估計;(3)檢驗前面分析得到的經驗模型是否合適。
畫散點圖
創建一個DataTemp的文件夾,在其中分別創建"data"、"demo"文件夾用於存放數據文件、Python程序文件。
把前面圖中的數據導入Excel中,命名為:「蒸汽供應.xlsx」,用來作為數據源。
數據導入Excel後創建Python文件:」leastsquare.py「。在文件頭加入utf-8編碼的說明以支持中文字符,然後添加必要的注釋。
# -*- coding: utf-8 -*-"""Created on Fri Mar 20 14:07:41 2020@author: gao"""import必要的第三方庫。
"""第三方庫"""importpandasaspdimportmatplotlib.pyplotaspltfromscipy.optimizeimportleastsqimportnumpyasnp使用下面的代碼將Excel數據讀入Python Pandas DataFrame中。
"""把excel中的數據讀入datafram"""filePath=u'../data/蒸汽供應.xlsx'#含中文字符,前面加u表示用Unicode 格式進行編碼data=pd.read_excel(filePath,index_col=u'序號')提取其中的Y、X列並繪製散點圖
Xi=data[u'X']Yi=data[u'Y']"""畫散點圖"""plt.figure()plt.scatter(Xi,Yi,color='red',label='sample data',linewidth=2)plt.legend(loc='lower right')plt.show()散點圖結果如下:
散點圖從圖中看出大致服從一個線性分布,所以我們採用一元線性回歸模型來進行分析。
回歸模型的參數估計
一元線性模型的一般公式為
一元線性回歸模型我們使用最小二乘法估算出α、β即可求出經驗回歸方程。
經驗模型Python中對一元線性模型的參數進行參數估計是很簡單的,如下代碼所示:
deffun(p,x):#回歸模型函數k,b=preturnk*x+bdeferror(p,x,y):#誤差returnfun(p,x)-yp0=np.array([1,3])para=leastsq(error,p0,args=(Xi,Yi))k,b=para[0]上面代碼的關鍵之處有三點:
(1)定義模型函數、誤差函數。其中誤差函數error,實際上就是我們模型的估計值與實際的觀察值之差,我們就是通過這個差值的最小二乘來對模型中的參數進行估計的。也就是說,前面的經驗模型的參數取不同的值,那對於xi可以求出不同的yi,這個yi是我們估計值和實際的觀測值進行求差就是估計誤差,參數取值不同估計誤差不同,我們要找到一組參數使得對於所有的觀測值的誤差的平方和最小。
(2)調用scipy的leastsq函數時,需要有誤差函數、初始參數作為輸入,還需要把我們讀到的觀測數據作為參數傳入leastsq函數,這是此函數的三個關鍵的輸入參數。
(3)leastsq的返回參數是多個,所以放到一個元組(tuple)中,返回tuple類型para的第一個元素para[0]是一個nupy.ndarray類型,存放的即是滿足最小二乘規則的估計參數。
經驗模型的效果
可以使用下面的代碼列印經過最小二乘運算後的經驗模型。
"""列印結果"""print('y='+str(round(k,2))+'x+'+str(round(b,2)))最後一步工作就是把我們的經驗模型的線畫到前面的散點圖上,看一下模型的效果。
"""繪製結果曲線"""x=np.linspace(20,80,2)y=k*x+b"""畫散點圖"""plt.figure()plt.scatter(Xi,Yi,color='red',label='sample data',linewidth=2)plt.plot(x,y,color='blue',label='result line')plt.legend(loc='lower right')plt.show()繪出的結果圖像如下:
模型結果曲線當然,我們還可以通過判定係數來看一下我們的回歸方程與數據擬合的效果好壞,這個在後續的文章中再說。