最小二乘法
将所有的点利用初始得到的多项式的值和实际值的差的平方做和,这就是所谓的误差函数,而我们所要做的就是使该误差函数取得它的极小值。
E
=
∑
(
f
(
x
i
)
−
y
i
)
2
E=\sum(f(x_i)-y_i)^2
E=∑(f(xi)−yi)2
通常我们假设
f
(
x
i
)
=
A
x
i
2
+
B
x
i
+
C
f(x_i)=Ax_i^2 + Bx_i+C
f(xi)=Axi2+Bxi+C之后的误差函数就如下所示:
E
=
∑
(
A
x
i
2
+
B
x
i
+
C
−
y
i
)
2
E=\sum(Ax_i^2 + Bx_i+C-y_i)^2
E=∑(Axi2+Bxi+C−yi)2
对于该误差函数求令其最小的A,B,C的值,利用高等数学中的求偏导,令偏导数为0,求的各个参数。
∂
E
∂
A
∣
=
2
∗
∑
(
A
x
i
2
+
B
x
i
+
C
−
y
i
)
∗
x
i
2
=
0
\left.\frac{\partial E}{\partial A}\right| = 2*\sum(Ax_i^2 + Bx_i+C-y_i)*x_i^2=0
∂A∂E∣∣∣∣=2∗∑(Axi2+Bxi+C−yi)∗xi2=0
.
.
.
.
.
.
......
......
以上为使用多项式去拟合数据的数学原理,以下使用python的程序实现一个简单的线性拟合程序:
#首先使用numpy生成x的序列
#导入相应的包
import numpy as np
from scipy.optimize import leastsq #最小二乘法函数
import matplotlib.pyplot as plt
#生成真实的模型
x = np.linspace(0,1,10)
ideal_y = np.sin(2*np.pi*x)#理想情况下的y值
#为了符合现实的情况,需要将真实模型的数据点加上正态分布的噪声
real_y = [np.random.normal(0,0.1)+t for t in ideal_y]
#建立多项式,并设定相应的初值
p = [2,1,1]
F = np.poly1d(p)#生成一个多项式$f(x)=2*x^2+x+1$
predict_y = F(x)#
def error(p,x,y):
ret = (np.poly1d(p))(x) -y
return ret
#最小二乘法求得多项式的各个系数
p_init = np.random.rand(M+1)#M为最高次的次数x^M,该p_init就是初始的多项式的各个系数
p_lsq = leastsq(error,p_init,args=(x,real_y))
p_lsq[0]#该项为通过最小二乘得到的系数
leastsq(误差函数,表述函数的参数,args()表示数据点)
具体的代码在Github上:Github代码