目录:
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()
运行结果: