最小二乘法

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

# coding=utf-8

import matplotlib.pyplot as plt
import math
import numpy
import random

fig = 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=0
xa=[]
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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值