最小二乘法

来源:互联网 发布:visio2010软件下载 编辑:程序博客网 时间:2024/06/05 06:39

关于公式推导可以参考这篇文章,还配了代码,不过代码只是实现了公式5的部分,而且代码循环有点多,稍微修改了一下。
http://blog.csdn.net/jairuschan/article/details/7517773/

# coding=utf-8import matplotlib.pyplot as pltimport mathimport numpyimport randomfig = plt.figure()ax = fig.add_subplot(111)#阶数为9阶order=9#ground truth曲线x = numpy.arange(-1,1,0.02)y = [((a*a-1)*(a*a-1)*(a*a-1)+0.5)*numpy.sin(a*2) for a in x]ax.plot(x,y,color='r',linestyle='-',marker='')#加入噪声i=0xa=[]ya=[]for xx in x:    yy=y[i]    d=float(random.randint(60,140))/100    #ax.plot([xx*d],[yy*d],color='m',linestyle='',marker='.')    i+=1    xa.append(xx*d)    ya.append(yy*d)ax.plot(xa,ya,color='m',linestyle='',marker='.')#进行曲线拟合matA=[]for i in range(order+1):    matA1 = []    for j in range(order+1):        tx = 0.0        for k in range(len(xa)):            tx+=xa[k]**(j+i)        matA1.append(tx)    matA.append(matA1)matA=numpy.array(matA)matB=[]for i in range(order+1):    ty = 0.0    for j in range(len(xa)):        ty+=ya[j]*xa[j]**i    matB.append(ty)matB=numpy.array(matB)matAA=numpy.linalg.solve(matA,matB)#画出拟合后的曲线xxa= numpy.arange(-1,1.06,0.01)yya=[]for i in range(0,len(xxa)):    yy=0.0    for j in range(0,order+1):        dy=1.0        for k in range(0,j):            dy*=xxa[i]        dy*=matAA[j]        yy+=dy    yya.append(yy)ax.plot(xxa,yya,color='g',linestyle='-',marker='')plt.show()

效果图如下:
红色为想要拟合的图片,不过加入了噪声,训练集为紫色点,结果如图绿色曲线。
这里写图片描述

0 0
原创粉丝点击