误差计算
使用预测值到真实值距离的平方来计算误差
def error(f,x,y): return sp.sum((f(x)-y)**2)
从一条简单的直线开始
scipy中的polyfit(多项式拟合)函数用户解决这个问题。
给定数据x和y,以及期望的多项式的阶(直线的阶是1)可以找到一个模型,能够最小化之前定义的误差函数
fp1,residuals,rank,sv,rcond = sp.polyfit(x,y,1,full=True)
该函数会把拟合函数所使用的参数返回,即fp1=
[ 2.59619213 989.02487106];把full设置为true可以获得更多逼近过程的背景信息。
在这里我们对残差感兴趣,即近似误差
# 散点坐标图 plt.scatter(x, y) # x坐标 plt.xlabel('Time') plt.ylabel('Hits/hour') # tick 标记号于 plt.xticks([w*7*24 for w in range(10)], ['week %i'%w for w in range(10)]) # 自动测量/规模 tight=紧 plt.autoscale(tight=True) fp1, residuals, rank, sv, rcond = sp.polyfit(x, y, 1, full=True) print fp1 # 根据参数创建模型 f1 = sp.poly1d(fp1) def error(f, x, y): return sp.sum((f(x)-y)**2) print error(f1, x, y) # 生成x值用于作图 fx = sp.linspace(0, x[-1], 1000) plt .plot(fx, f1(fx), linewidth=4) plt.legend(["d=%i" % f1.order], loc="upper left") # 2阶多项式 f2p = sp.polyfit(x, y, 2) f2 = sp.poly1d(f2p) print error(f2, x, y) plt .plot(fx, f2(fx), linewidth=4) plt.legend(["d=%i" % f1.order,"d=%i" % f2.order], loc="upper left") # 开启网格 plt.grid() # 显示图表 plt.show()