1.一般最小二乘法:
假设存在矩阵B,使得XB-Y=0,然后经过2步简单的公式转换
三步到位,是不是很简单。
但X矩阵要怎么得到呢?
-
设拟合多项式为:
-
各点到这条曲线的距离之和,即偏差平方和如下:
-
求得方差的极小值,对a0,...ak依次求偏导为0:
-
表示成矩阵的形式:
-
将这个范德蒙得矩阵变形再化简:
- 也就是说XB=Y,那么B = (X'X)^-1 * X'*Y,便得到了系数矩阵B,同时,XB=Y我们也就得到了拟合曲线。
#encoding=UTF-8
'''''
Created on 2014年6月30日
@author: jin
'''
from numpy import *
import matplotlib.pyplot as plt
from random import *
def loadData():
x = arange(-1,1,0.02)
y = ((x*x-1)**3+1)*(cos(x*2)+0.6*sin(x*1.3))
#生成的曲线上的各个点偏移一下,并放入到xa,ya中去
xr=[];yr=[];i = 0
for xx in x:
yy=y[i]
#x[i]不可以小于x[i+1],一旦小于,就变成二维问题了,一维基函数就不适用了
d=float(randint(90,110))/100
dd=float(randint(80,120))/100
i+=1
xr.append(xx*d)
yr.append(yy*dd)
xr = array(xr)
yr = array(yr)
return x,y,xr,yr
def XY(x,y,order):
X=[]
for i in range(order+1):
X.append(x**i)
X=mat(X).T
Y=array(y).reshape((len(y),1))
return X,Y
def figPlot(x1,y1,x2,y2):
plt.plot(x1,y1,color='g',linestyle='-',marker='')
plt.plot(x2,y2,color='m',linestyle='',marker='.')
plt.show()
def Main():
x,y,xr,yr = loadData()
X,Y = XY(xr,yr,9)
XT=X.transpose()#X的转置
B=dot(dot(linalg.inv(dot(XT,X)),XT),Y)#套用最小二乘法公式
myY=dot(X,B)
figPlot(xr,myY,xr,yr)
Main()
运行结果:
参考:
http://www.360doc.com/content/18/1215/12/2289804_801959580.shtml
http://blog.csdn.net/JairusChan](http://blog.csdn.net/JairusChan