问题描述
假定给定一个训练数据集:
T={(x1,y1),(x2,y2),⋯,(xN,yN)}
其中,
xi∈R
是输入
x
的观测值,
yi∈R
是相应的输出y的观测值,
i=1,2,⋯,N
,多项式函数拟合的任务是假设给定数据由
M
次多项式函数生成,选择最有可能产生这些数据的
M
次多项式函数,即在
M
次多项式函数中选择一个对已知数据以及未知数据都有很好预测能力的函数。
设
M
次多项式为
fM(x,w)=w0+w1x+w2x2+⋯+wMxM=∑j=0Mwjxj
式中
x
式单变量输入,
w0,w1,⋯,wm
是
M+1
个参数。
用平方损失作为损失函数,系数
12
是为了方便计算,将模型与训练数据代入,有
L(w)=12∑i=1N(∑j=0Mwjxji−yi)2
对
wj
求偏导并令其为
0
书里这里的求导是错误的,就不写错误的推导了,下面给出正确的推导
set∂ L(w)∂wk=0⇒12∑i=1N2(∑j=0Mwjxji−yi)×xki=0⇒∑i=1N∑j=0Mwjxji=∑i=1Nxkiyi(k=0,1,2,⋯,M)
所以要求拟合多项式系数
w∗0,w∗1,⋯,w∗M
需要解下面这个线性方程组,下面的求和符号上下限都是
i=1
到
N
,为了方便略去不写。
⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢N∑xi∑x2i⋮∑xMi∑xi∑x2i∑x3i⋮∑xM+1i∑x2i∑x3i∑x4i⋮∑xM+2i⋯⋯⋯⋱⋯∑xMi∑xM+1i∑xM+2i⋯∑x2Mi⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎛⎝⎜⎜⎜⎜⎜⎜⎜w0w1w2⋮wm⎞⎠⎟⎟⎟⎟⎟⎟⎟=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢∑yi∑xiyi∑x2iyi⋮∑xMiyi⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥
所以计算出
∑i=1Nxji(j=0,1,2,⋯,2M)
和
∑i=1Nxjiyi(j=0,1,2,⋯,M)
然后将这些值带入上述线性方程组求解即可。
下面给出python实现
'''
作者:Xiaole Wen
程序:多项式曲线拟合算法
'''
import matplotlib.pyplot as plt
import math
import numpy
import random
fig = plt.figure()
ax = fig.add_subplot(111)
order=9
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]
plt.plot(x,y)
i=0
xa=[]
ya=[]
for xx in x:
yy=y[i]
d=float(random.randint(60,140))/100
i+=1
xa.append(xx*d)
ya.append(yy*d)
ax.plot(xa,ya,color='m',linestyle='',marker='.')
bigMat=[]
for j in range(0,2*order+1):
sum=0
for i in range(0,len(xa)):
sum+=(xa[i]**j)
bigMat.append(sum)
matA=[]
for rowNum in range(0,order+1):
row=bigMat[rowNum:rowNum+order+1]
matA.append(row)
matA=numpy.array(matA)
matB=[]
for i in range(0,order+1):
ty=0.0
for k in range(0,len(xa)):
ty+=ya[k]*(xa[k]**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=(xxa[i]**j)
dy*=matAA[j]
yy+=dy
yya.append(yy)
ax.plot(xxa,yya,color='g',linestyle='-',marker='')
ax.legend()
plt.show()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
下面给出阶叔分别取3和取9的时候的拟合结果
图中蓝色的线代表原始数据生成函数,绿色代表拟合函数
![这里写图片描述](https://img-blog.csdn.net/20150704230959776)