1. 程式人生 > >[機器學習系統設計(一)]數據導入,預處理與一次二次擬合

[機器學習系統設計(一)]數據導入,預處理與一次二次擬合

畫圖 標簽 參數 殘差 res 模型 pri itl 創建模型

目錄:

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()

運行結果:

技術分享

[機器學習系統設計(一)]數據導入,預處理與一次二次擬合