[c++]两分钟弄懂"最小二乘法拟合直线"

二月的最后一天,想起来还本月没有写过博客,所以临时综合一篇小文章,当做这个月的“作业”了,本篇文章属于转载类型。

转载来源

1.https://blog.csdn.net/wokaowokaowokao12345/article/details/72850143

2.http://blog.csdn.net/pl20140910/article/details/51926886

最小二乘法,又称最小平方法。它通过最小化误差的平方和寻找数据的最佳函数匹配。主要作用是从一堆相关数据中求解数据的一般性规律。在图像处理方面多用于各种形状的拟合。

最小二乘拟合直线,主要体现为找到一条直线,使得所有已知的点到这条直线的欧式距离的和最小(或者理解为点到直线的误差平方和最小)。开始之前先引入一个误差的概念。已知直线y=2x。现有点(x1,y1),求误差是多少,答案就是y1-2x1。

然后我们今天要说的就开始了

1.设直线方程(使用截距式)

  y=kx+b(适用于不垂直于xx轴的直线)

注:斜率为k,y轴截距为b

2.已知点集

x_1,y_1).........................(x_iy_i

3.求点到直线的误差平方和

具体的公司为 

高数中极值定理可知,误差方程一阶导数等于0处取得极值,因此分别对其关于k和b求导,解k,b值使得误差函数取最小值。可得

 

于是k和b也就求解出来了,这里我们还要加一个相关系数r 的求解

当r>0时,斜率=X的标准差/Y的标准差;当r<0时,斜率=-X的标准差/Y的标准差;的直线。通常用SD线来直观的表示数据的走向:

1)当r<0时,SD线的斜率小于0时,则说明数据负相关,即当x增大时y减少。

2)当r>0时,SD线的斜率大于0时,则说明数据正相关,此时当x增大时y增大。

3)相关系数r的范围在[-1,1]之间,当r=0时表示数据相关系数为0(不相关)。当r=正负1时,表示数据负相关,此(x,y)点数据都在SD线上。

4)r的值越接近正负1说明(x,y)越靠拢SD线,说明数据相关性越强,r的值越接近0说明(x,y)点到SD线的散度越大(越分散),数据相关性越小。

4.c++实现

void LineFitLeastSquares(float *data_x, float *data_y, int data_n)  
{  
    float A = 0.0;  
    float B = 0.0;  
    float C = 0.0;  
    float D = 0.0;  
    float E = 0.0;  
    float F = 0.0;  
  
    for (int i=0; i<data_n; i++)  
    {  
        A += data_x[i] * data_x[i];  
        B += data_x[i];  
        C += data_x[i] * data_y[i];  
        D += data_y[i];  
    }  
  
    // 计算斜率a和截距b  
    float a, b, temp = 0;  
    if( temp = (data_n*A - B*B) )// 判断分母不为0  
    {  
        a = (data_n*C - B*D) / temp;  
        b = (A*D - B*C) / temp;  
    }  
    else  
    {  
        a = 1;  
        b = 0;  
    }  
  
    // 计算相关系数r  
    float Xmean, Ymean;  
    Xmean = B / data_n;  
    Ymean = D / data_n;  
  
    float tempSumXX = 0.0, tempSumYY = 0.0;  
    for (int i=0; i<data_n; i++)  
    {  
        tempSumXX += (data_x[i] - Xmean) * (data_x[i] - Xmean);  
        tempSumYY += (data_y[i] - Ymean) * (data_y[i] - Ymean);  
        E += (data_x[i] - Xmean) * (data_y[i] - Ymean);  
    }  
    F = sqrt(tempSumXX) * sqrt(tempSumYY);  
  
    float r;  
    r = E / F;  
}  

好了,最小二乘拟合直线到此结束,以后有时间再说明一下拟合圆

猜你喜欢

转载自blog.csdn.net/qq_36251561/article/details/88020558