python_numpy最小二乘法的曲线拟合
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python_numpy最小二乘法的曲线拟合相关的知识,希望对你有一定的参考价值。
参考技术A在了解了最小二乘法的基本原理之后 python_numpy实用的最小二乘法理解 ,就可以用最小二乘法做曲线拟合了
从结果中可以看出,直线拟合并不能对拟合数据达到很好的效果,下面我们介绍一下曲线拟合。
b=[y1]
[y2]
......
[y100]
解得拟合函数的系数[a,b,c.....d]
CODE:
根据结果可以看到拟合的效果不错。
我们可以通过改变
来调整拟合效果。
如果此处我们把拟合函数改为最高次为x^20的多项式
所得结果如下:
矫正 过拟合 现象
在保持拟合函数改为最高次为x^20的多项式的条件下,增大样本数:
通过结果可以看出,过拟合现象得到了改善。
数值计算方法 Chapter3. 曲线拟合的最小二乘法
1. 线性拟合和二次拟合函数
最小二乘法本质上就是求一个事先定义一个函数,然后使用已知的采样点结果拟合函数的参数,使得所有采样点的均方误差最小。
即:
φ ( x ) = a r g m i n ∑ i ∣ φ ( x i ) − y i ∣ 2 \\varphi(x) = argmin\\ \\sum_i|\\varphi(x_i) - y_i|^2 φ(x)=argmin i∑∣φ(xi)−yi∣2
1. 线性拟合
我们假定拟合曲线为:
φ ( x ) = a x + b \\varphi(x) = ax + b φ(x)=ax+b
则有拟合误差为:
Q = ∑ i ( a x i + b − y i ) 2 Q = \\sum_i(ax_i+b-y_i)^2 Q=i∑(axi+b−yi)2
要使得拟合误差 Q Q Q最小,则我们有 Q Q Q对于参数 a , b a,b a,b的偏导均为0,因此,我们即有:
∂ Q ∂ a = ∑ i 2 x i ( a x i + b − y i ) = 0 ∂ Q ∂ b = ∑ i 2 ( a x i + b − y i ) = 0 \\left\\ \\beginaligned \\frac\\partial Q\\partial a &= \\sum_i 2x_i(ax_i + b - y_i) = 0 \\\\ \\frac\\partial Q\\partial b &=\\sum_i 2(ax_i + b - y_i) = 0 \\endaligned \\right. ⎩⎪⎪⎪⎨⎪⎪⎪⎧∂a∂Q∂b∂Q=i∑2xi(axi+b−yi)=0=i∑2(axi+b−yi)=0
可以解得:
a = n ⋅ ∑ i x i y i − ( ∑ i x i ) ( ∑ i y i ) n ⋅ ∑ i x i 2 − ( ∑ i x i ) 2 b = 1 n ∑ i y i − 1 n ( ∑ i x i ) ⋅ a \\left\\ \\beginaligned a &= \\fracn \\cdot \\sum_i x_iy_i - (\\sum_i x_i)(\\sum_i y_i)n \\cdot \\sum_ix_i^2 - (\\sum_i x_i)^2 \\\\ b &= \\frac1n \\sum_i y_i - \\frac1n (\\sum_i x_i) \\cdot a \\endaligned \\right. ⎩⎪⎪⎪⎨⎪⎪⎪⎧ab=n⋅∑ixi2−(∑ixi)2n⋅∑ixiyi−(∑ixi)(∑iyi)=n1i∑yi−n1(i∑xi)⋅a
2. 二次拟合函数
类似的,我们可以得到二次拟合函数的最小二乘法的结果。
定义拟合函数为:
φ ( x ) = a x 2 + b x + c \\varphi(x) = ax^2 + bx + c φ(x)=ax2+bx+c
则有拟合误差:
Q = ∑ i ( a x i 2 + b x i + c ) 2 Q = \\sum_i(ax_i^2 + bx_i + c)^2 Q=i∑(axi2+bxi+c)2
同样,我们可以解得,在极值条件下,有:
∂
Q
∂
a
=
∑
i
2
x
i
2
(
a
x
i
2
+
b
x
i
+
c
−
y
i
)
=
0
∂
Q
∂
b
=
∑
i
2
x
i
(
a
x
i
2
+
b
x
i
+
c
−
y
i
)
=
0
∂
Q
∂
c
=
∑
i
2
(
a
x
i
2
+
b
x
i
+
c
−
y
i
)
=
0
\\left\\ \\beginaligned \\frac\\partial Q\\partial a &= \\sum_i 2x_i^2(ax_i^2 + bx_i + c - y_i) = 0 \\\\ \\frac\\partial Q\\partial b &=\\sum_i 2x_i(ax_i^2 + bx_i + c - y_i) = 0 \\\\ \\frac\\partial Q\\partial c &=\\sum_i 2(ax_i^2 + bx_i + c - y_i) = 0 \\endaligned \\right.
⎩⎪⎪⎪⎪⎪⎪⎪⎪以上是关于python_numpy最小二乘法的曲线拟合的主要内容,如果未能解决你的问题,请参考以下文章