怀着沉痛的心情,拖着疲惫的身心,为了拟合好圆,我实在不得不上最小二乘法了(我上班写的代码不要想了,不可能发在blog里的),现在进入正题。

(1)基本原理

名称

 

 

 

 

 

 

自变量:x

python scipy参数拟合 最小二乘法 opencv最小二乘法拟合_系数矩阵

python scipy参数拟合 最小二乘法 opencv最小二乘法拟合_方程组_02

python scipy参数拟合 最小二乘法 opencv最小二乘法拟合_opencv_03

……

python scipy参数拟合 最小二乘法 opencv最小二乘法拟合_opencv_04

python scipy参数拟合 最小二乘法 opencv最小二乘法拟合_opencv_05

函数(因变量):y

python scipy参数拟合 最小二乘法 opencv最小二乘法拟合_系数矩阵_06

python scipy参数拟合 最小二乘法 opencv最小二乘法拟合_系数矩阵_07

python scipy参数拟合 最小二乘法 opencv最小二乘法拟合_系数矩阵_08

……

python scipy参数拟合 最小二乘法 opencv最小二乘法拟合_系数矩阵_09

python scipy参数拟合 最小二乘法 opencv最小二乘法拟合_opencv_10

求以下拟合函数:

python scipy参数拟合 最小二乘法 opencv最小二乘法拟合_系数矩阵_11

,使得:

python scipy参数拟合 最小二乘法 opencv最小二乘法拟合_方程组_12

拟合条件:拟合曲线与各数据点在y方向的误差平方和最小.

拟合函数为一元函数时--函数图形为平面曲线--曲线拟合 

解决曲线拟合,最先是确定拟合函数的形式。即适当选取

python scipy参数拟合 最小二乘法 opencv最小二乘法拟合_opencv_13

选幂函数{1,x,x2, ···,xn}, 则多项式拟合函数φ(x)可表示为:

python scipy参数拟合 最小二乘法 opencv最小二乘法拟合_opencv_14

PS:常见的曲线拟合方法:

1.使偏差绝对值之和最小

     

python scipy参数拟合 最小二乘法 opencv最小二乘法拟合_拟合_15

 

2.使偏差绝对值最大的最小

     

python scipy参数拟合 最小二乘法 opencv最小二乘法拟合_拟合_16

 

3.使偏差平方和最小

 

     

python scipy参数拟合 最小二乘法 opencv最小二乘法拟合_拟合_17

 

按偏差平方和最小的原则选取拟合曲线,并且采取二项式方程为拟合曲线的方法,称为最小二乘法。

a0、a1、a2......an是幂系数,也是拟合所求的未知量。
实际中拟合函数有指数函数、三角函数等,根据数据 的分布特点来选取合适的拟合函数。
将第 i 个样本点的x坐标带入φ(x),得到:

 

python scipy参数拟合 最小二乘法 opencv最小二乘法拟合_系数矩阵_18

实际中拟合函数有指数函数、三角函数等,根据数据 的分布特点来选取合适的拟合函数。

这个就是二次方程,我们期望S最小。此时,方程中的x、y已知,想求的是a0 a1 a2 ...... an。

S最小的必要条件是:

python scipy参数拟合 最小二乘法 opencv最小二乘法拟合_opencv_19

整理得到如下正规方程组

python scipy参数拟合 最小二乘法 opencv最小二乘法拟合_opencv_20

解此方程组得系数a0 a1 a2 ...... an,, 得出拟合函数φ(x)

最小二乘法:以残差平方和最小问题的解来确定拟合函数

二、超定方程组得最小二乘解

 


python scipy参数拟合 最小二乘法 opencv最小二乘法拟合_拟合_21

写成向量内积形式:

python scipy参数拟合 最小二乘法 opencv最小二乘法拟合_opencv_22

a0 a1 a2 ...... an为待定系数,满足:

python scipy参数拟合 最小二乘法 opencv最小二乘法拟合_拟合_23

此m个等式如下建立方程组:

python scipy参数拟合 最小二乘法 opencv最小二乘法拟合_系数矩阵_24

方程数(m)多于未知数个数(n+1),此类方程组称为超定方程组。下列正规方程组中k个方程中aj的系数

 

python scipy参数拟合 最小二乘法 opencv最小二乘法拟合_系数矩阵_25

python scipy参数拟合 最小二乘法 opencv最小二乘法拟合_opencv_26

python scipy参数拟合 最小二乘法 opencv最小二乘法拟合_opencv_27

 

经推导,得到最小二次方,幂函数拟合公式如下:

 ΦT* Φ*a= ΦT*y

 其中Φ是样本点坐标x的超定矩阵,将所有x带入该向量[1  x  x^2 ... ...  x^n]中,就得到超定矩阵Φ。ΦT表示Φ的转置

把这些等式表示成矩阵的形式,就可以得到下面的矩阵:

          
即X*A=Y。

我们只要解出这个线性方程,即可求得拟合曲线多项式的系数矩阵。而在opencv中,有一个专门用于求解线性方程的函数,即cv::solve(),具体调用形式如下:

int cv::solve(    cv::InputArray X, // 左边矩阵X, nxn    cv::InputArray Y, // 右边矩阵Y,nx1    cv::OutputArray A, // 结果,系数矩阵A,nx1    int method = cv::DECOMP_LU // 估算方法);

我们只需要按照上述原理,构造出矩阵X和Y,即可调用该函数,计算出多项式的系数矩阵A