[机器学习系统设计]数据导入,预处理与一次二次拟合

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[机器学习系统设计]数据导入,预处理与一次二次拟合相关的知识,希望对你有一定的参考价值。

目录:

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

运行结果:

技术分享

 

以上是关于[机器学习系统设计]数据导入,预处理与一次二次拟合的主要内容,如果未能解决你的问题,请参考以下文章

机器学习100天(二十三):023 欠拟合与过拟合

机器学习100天(二十三):023 欠拟合与过拟合

吴恩达“机器学习”——学习笔记二

机器学习基础2--评价回归模型

范数在机器学习的应用

数字化实验室系统