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)yi2

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+byi)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. aQbQ=i2xi(axi+byi)=0=i2(axi+byi)=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=nixi2(ixi)2nixiyi(ixi)(iyi)=n1iyin1(ixi)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最小二乘法的曲线拟合的主要内容,如果未能解决你的问题,请参考以下文章

用加权最小二乘法拟合曲线matlab?

谁能给一个java编写的利用最小二乘法进行曲线拟合的算法?

最小二乘法多项式曲线拟合原理与实现(转)

Python最小二乘法拟合与作图

一文速学-最小二乘法曲线拟合算法详解+项目代码

矩阵参数怎么用最小二乘法拟合