python實現一元線性迴歸
阿新 • • 發佈:2019-01-11
最近在看中長期水文預報,打算使用python語言實現課本的模型並進行例項的計算結果的檢驗,為了監督自己和整理記錄自己實現的模型程式碼,打算寫部落格記錄自己的程式碼實現和部分思路。首先,自己不使用現成的模組實現的是一元線性迴歸模型,然後和模組實現對比,學習模組的呼叫。接下來是直接編寫的程式檔案,並計算了幾個檢驗係數,沒有使用sklearn模組:
#導模組 import numpy as np import pandas as pd #全域性變數初始化 X=[] Y=[] Y_predict=[] S_xy=0 S_xx=0 S_yy=0 U=0 #從csv檔案中讀取資料 def get_data(file_name): #1.利用pandas讀取csv data=pd.read_csv(file_name,header=None) #2.賦值預報因子和預報物件並輸出 X=data[0]#預報因子 Y=data[1]#預報物件 return X,Y #print(get_data('ycfj.csv')) X,Y=get_data('ycfj.csv') #計算預報因子和預報物件的均值 X_mean=np.mean(X) Y_mean=np.mean(Y) #計算迴歸係數 for i in range(len(X)): S_xy+=(X[i]-X_mean)*(Y[i]-Y_mean) S_xx+=pow(X[i]-X_mean,2) S_yy+=pow(Y[i]-Y_mean,2) b1=S_xy/S_xx b0=Y_mean-b1*X_mean print('b1:'+str(b1)+' b0:'+str(b0)) #t檢驗(顯著性檢驗) t=S_xy*pow((len(X)-2)/(S_xx*S_yy-pow(S_xy,2)),0.5) print(t) #相關係數檢驗 r=S_xy/pow(S_xx*S_yy,0.5) #可決係數檢驗 for i in range(len(X)): y_predict=b0+b1*X[i] Y_predict.append(y_predict) U+=pow(Y_predict[i]-Y_mean,2) R2=U/S_yy print(R2)
下面的是使用了sklearn模組,並進行了繪圖:
#導模組 import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression #全域性變數初始化 X=[] Y=[] Y_predict=[] S_xy=0 S_xx=0 S_yy=0 U=0 #從csv檔案中讀取資料 def get_data(file_name): #1.利用pandas讀取csv data=pd.read_csv(file_name,header=None) #2.賦值預報因子和預報物件並輸出 X=data[0]#預報因子 Y=data[1]#預報物件 return X,Y #print(get_data('ycfj.csv')) X,Y=get_data('ycfj.csv') X=np.array(X).reshape(-1,1)#將陣列轉換? Y=np.array(Y).reshape(-1,1) def my_linear_model(X,Y): #1.呼叫模組,構造迴歸物件 regr=LinearRegression() regr.fit(X,Y) #2.構造返回字典 predictions={} #2.1截距 predictions['intercept']=regr.intercept_ #2.2斜率值 predictions['coefficient']=regr.coef_ #2.3預測值 predictions['predict_value']=regr.predict(X) return predictions # 繪圖 def show_linear_line(X,Y): predictions=my_linear_model(X,Y) # 1.繪出已知資料散點圖 plt.scatter(X,Y,color='blue') # 2. 繪出預測直線 plt.plot(X,predictions['predict_value'],color ='red',linewidth=4) plt.title('Monolinear Regression Analysis') plt.xlabel('X') plt.ylabel('Y') plt.show() def main(): show_linear_line(X,Y) if __name__=='__main__': main()