Python实现一元及多元线性回归
生活随笔
收集整理的這篇文章主要介紹了
Python实现一元及多元线性回归
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Python實現線性回歸
- 實現目標
- 實驗數據
- 結果分析
- 數據集1下的回歸分析
- 數據集2下的回歸分析
- 源代碼
實現目標
1.實現一元(或多元)線性回歸
a. 根據對客觀現象的定性認識初步判斷現象之間的相關性
b. 繪制散點圖
c. 進行回歸分析,擬合出回歸模型
d. 對回歸模型進行檢驗—計算相關系數、異方差檢驗(散點圖)
e. 進行回歸預測
2實現離差形式的一元線性回歸
實驗數據
數據如下圖,該數據為通過中國氣象局數據庫統計而來的2019年廈門市日平均氣溫數據(Data為1時日期為1月1日),該數據的散點圖與折線圖分別如圖1圖2所示。從圖中可以看出廈門為典型的北半球夏季高溫冬季低溫氣候,且存在波動。
此外,為了方便進行一次線性回歸及其相關操作,我取出一半數據(Data值為0至180)的數據進行線性回歸模型的構建,如圖3
結果分析
數據集1下的回歸分析
最終實驗結果如圖4所示,其中第一行表示一次回歸模型的擬合函數,如圖5所示,很明顯的可以看出誤差極大,因此我們對其進行二次回歸
第二行結果為為此回歸擬合函數,如圖6所示,可以看出擬合效果較好
同時對一次線性回歸計算得出相關系數為0.7861736064961535,u2-x散點圖即其回歸如圖所示
通過離差形式的線性回歸擬合模型如下
數據集2下的回歸分析
最終實驗結果如圖10所示,其余結果(圖11-圖15)解釋同3.1.1
源代碼
數據下載點這里:(data1)(data2)
import xlrd
from pylab import *
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
mpl.rcParams['font.sans-serif'] = ['SimHei']def readFire(dataFir):dataN=[]dataX=[]dataY=[]table = dataFir.sheet_by_index(0) for i in range(1,table.nrows): line=table.row_values(i) dataN.append(line) dataN=np.array(dataN) dataX = dataN[:,0]dataY = dataN[:,4]return dataX,dataYdef Visual(x, y):plt.title('折線圖')plt.plot(x, y)plt.xlabel("Date")plt.ylabel("Temperature(°C)")plt.show()plt.title('散點圖')plt.scatter(x, y,s=10,color="b")plt.xlabel("Date")plt.ylabel("Temperature(°C)")plt.show()def Regression1(x,y):n=len(x)xx=0xy=0xAvg=0yAvg=0for i in range(n):xy = xy + x[i]*y[i]xx = xx + x[i]*x[i]xAvg = xAvg + x[i]yAvg = yAvg + y[i]xAvg=xAvg/nyAvg=yAvg/nb = (xy-n*xAvg*yAvg)/(xx-n*xAvg*xAvg) a = yAvg - b*xAvgprint('一次回歸方程為:y=',b,'* x +',a)plt.title('一次線性回歸')plt.scatter(x,y,s=10,color="b") x=np.linspace(0,n,n)yp=b*x+aplt.plot(x,yp,color="r")plt.show()def Regression2(x, y):X = x.reshape(-1,1)X2 = np.hstack([X**2,X]) lr = LinearRegression()lr.fit(X2,y)print('二次回歸方程為:y=',lr.coef_[0],'x^2 *',lr.coef_[1],'x +',lr.intercept_)yp = lr.predict(X2)plt.title('二次線性回歸')plt.scatter(x,y,s=10,color="b")plt.plot(x,yp,color='r')plt.show()XGXS(x,y,yp)def XGXS(x,y,yp):n=len(x)y1=0y2=0yAvg=0for i in range(n):yAvg = yAvg + y[i]yA=yAvg/nfor i in range(n):y1 = y1+(yp[i]-yA)**2y2 = y2+(y[i]-yA)**2u2 = (y-yp)**2plt.title('u2-x散點圖')plt.scatter(x,u2,s=10,color="b")plt.show()print('回歸模型檢驗:')R=pow(y1/y2,.5)print('相關系數為:',R)Regression1(x,u2)def LiCha(x,y):n=len(x)xMat = np.mat(x).TyMat = np.mat(y)xTx = xMat.T * xMatws = xTx.I * xMat.T * yMat.Tx=np.linspace(0,n,n)yp = xMat * wsprint('離差回歸方程為:y=',ws,'* x ')plt.title('離差形式線性回歸')plt.scatter(x,y,s=10,color="b") plt.plot(x,yp,color="r")plt.show()if __name__ == '__main__':dataFir = xlrd.open_workbook("data2.xlsx") dataX,dataY = readFire(dataFir)#可視化數據Visual(dataX, dataY)#一次線性回歸Regression1(dataX,dataY)#二次線性回歸Regression2(dataX, dataY)#離差形式線性回歸LiCha(dataX,dataY)
總結
以上是生活随笔為你收集整理的Python实现一元及多元线性回归的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python图像中如何显示中文
- 下一篇: 照相机模型与增强现实(相机标定)