[機器學習系統設計(一)]數據導入,預處理與一次二次擬合
目錄:
1.數據的讀取
2.數據的預處理
3.一次擬合
4.二次擬合
5.分段擬合
6.畫圖
案例:已收集某個網頁每個小時被點擊的次數,第一行數據為小時,第二行數據表示點擊次數。現在需擬合出點擊次數與時間的關系。
1.讀取數據
(1)使用SciPy中的genfromtxt()讀取數據
data=sp.genfromtxt("web_traffic.tsv",delimiter="\t")
(2)返回數據的長度
print (data.shape)
2.清洗數據
可以看到第二列中包含許多’NaN’值,需要去除這些無效的數據。
(1)返回無效值的個數
print sp.sum(sp.isnan(y))
(2)利用取反抽取有效值
x=x[~sp.isnan(y)]
y=y[~sp.isnan(y)]
3.一次擬合
(1)通過polyfit()擬合
fp1=sp.polyfit(x,y,1)
返回:fp1= 2.59619213 989.02487106
因此這條函數被擬合為f(x)= 2.59619213x+989.02487106
(2)通過poly1d()創建模型函數
f1=sp.poly1d(fp1)
4.二次擬合 fp2=sp.polyfit(x,y,2)
5.分段擬合
可以看到數據中間有明顯的拐點,利用拐點將數據分成兩段,分別擬合
guadian=588 #拐點:4*7*24
xa=x[:guadian] #取拐點之前的數據
ya=y[:guadian]
xb=x[guadian:] #去拐點之後的數據
yb=y[guadian:]
#兩段數據分別擬合
fa=sp.poly1d(sp.polyfit(xa,ya,1))
fb=sp.poly1d(sp.polyfit(xb,yb,1))
6.畫圖:以一開始的畫散點圖為例
plt.scatter(x,y,c=‘b‘,marker=‘o‘) #畫散點圖
plt.title("Web traffic") #標題
plt.xlabel(‘time‘) #x軸標簽
plt.ylabel(‘Hits/hour‘) #y軸標簽
plt.xticks([w*7*24 for w in range(10)],[‘week %i‘%w for w in range(10)]) #x軸刻度值
plt.autoscale(tight=True)
plt.grid()
plt.show()
代碼:
# -*- coding: utf-8 -*- import scipy as sp import matplotlib.pyplot as plt #Step 1: 讀取數據 #使用SciPy中的genfromtxt()讀取數據 data=sp.genfromtxt("web_traffic.tsv",delimiter="\t") #文件名,分隔符 print (data.shape) #(743L, 2L) 返回長度 #Step 2: 預處理和清洗數據 x=data[:,0] y=data[:,1] sp.sum(sp.isnan(y)) #返回y中無效值nan的總數 x=x[~sp.isnan(y)] #清洗掉y中的nan值 y=y[~sp.isnan(y)] #畫圖 plt.scatter(x,y,c=‘b‘,marker=‘o‘) #畫散點圖 plt.title("Web traffic") #標題 plt.xlabel(‘time‘) #x軸標簽 plt.ylabel(‘Hits/hour‘) #y軸標簽 plt.xticks([w*7*24 for w in range(10)],[‘week %i‘%w for w in range(10)]) #x軸刻度值 plt.autoscale(tight=True) plt.grid() plt.show() #Step 3:直線擬合 fp1,residuals,rank,sv,rcond=sp.polyfit(x,y,1,full=True) print("模型參數:%s"% fp1) #2.59619213 989.02487106 即f(x)=2.59x+989 print(residuals) #3.17389767e+08 返回殘差 f1=sp.poly1d(fp1) fx=sp.linspace(0,x[-1],1000) #取x的值。技巧x[-1] plt.plot(fx,f1(fx),linewidth=4,color=‘r‘) #f1(fx)為對應的y值 plt.legend(["d=%i"%f1.order],loc="upper left") #左上角標記 plt.scatter(x,y,c=‘b‘,marker=‘.‘) plt.title("Web traffic") plt.xlabel(‘time‘) plt.ylabel(‘Hits/hour‘) plt.xticks([w*7*24 for w in range(10)],[‘week %i‘%w for w in range(10)]) plt.autoscale(tight=True) plt.grid() plt.show() #Step 4:二次擬合 fp2=sp.polyfit(x,y,2) #2表示擬合的次數為二 print("模型參數:s"% fp2) f2=sp.poly1d(fp2) fx=sp.linspace(0,x[-1],1000) plt.plot(fx,f2(fx),linewidth=4,color=‘r‘) plt.legend(["d=%i"%f2.order],loc="upper left") plt.scatter(x,y,c=‘b‘,marker=‘.‘) plt.title("Web traffic") plt.xlabel(‘time‘) plt.ylabel(‘Hits/hour‘) plt.xticks([w*7*24 for w in range(10)],[‘week %i‘%w for w in range(10)]) plt.autoscale(tight=True) plt.grid() plt.show() #Step 5:分段擬合 guadian=588 #拐點:4*7*24 xa=x[:guadian] #取拐點之前的數據 ya=y[:guadian] xb=x[guadian:] #取拐點之後的數據 yb=y[guadian:] #兩段數據分別擬合 fa=sp.poly1d(sp.polyfit(xa,ya,1)) fb=sp.poly1d(sp.polyfit(xb,yb,1)) #畫圖 fx1=sp.linspace(0,xa[-1],1000) fx2=sp.linspace(xb[0],xb[-1],1000) plt.plot(fx1,fa(fx),linewidth=4,color=‘r‘) plt.plot(fx2,fb(fx),linewidth=4,color=‘r‘) plt.scatter(x,y,c=‘b‘,marker=‘.‘) plt.title("Web traffic") plt.xlabel(‘time‘) plt.ylabel(‘Hits/hour‘) plt.xticks([w*7*24 for w in range(10)],[‘week %i‘%w for w in range(10)]) plt.axis([0,750,1000,6000]) #定義x,y軸範圍 plt.grid() plt.show()
運行結果:
[機器學習系統設計(一)]數據導入,預處理與一次二次擬合