1. 程式人生 > >python實現一元線性迴歸

python實現一元線性迴歸

最近在看中長期水文預報,打算使用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()