最小二乘法的嵌入式C语言实现

1. 最小二乘法

首先举个例子。

针对线性最小二乘法即直线拟合,如下图(来自维基百科)所示:

根据已有的数据(图中的点),来做出一条最贴近数据发展趋势的直线。

通过这条直线,我们可以对未来的数据进行预测,因为基本会落在这条直线附近。

当然了,最小二乘法不只是直线,还可以是曲线,本文不讨论。

2. 求解直线方程

我们现在要做的,就是求解直线方程。

假设已知有N个点,设这条直线方程为:  y = a·x + b

其中,a和b的计算公式如下:

3. 算法代码

STATUS LeastSquareLinearFit(DOUBLE x[], DOUBLE y[], const WORD32 num, DOUBLE *a, DOUBLE *b)
{
    WORD32 i=0;
    DOUBLE denominator=0.0;
    DOUBLE sum_xsquared = 0.0;
    DOUBLE sum_y = 0.0;
    DOUBLE sum_x = 0.0;
    DOUBLE sum_xy = 0.0;


    for (i = 0; i < num; ++i)
    {
        sum_xsquared += x[i]*x[i];
        sum_y += y[i];
        sum_x += x[i];
        sum_xy += x[i]*y[i];
    }


    denominator=(num*sum_xsquared - sum_x*sum_x);
    if(0==denominator)
    {
        return FUNC_ERROR;
    }
    *a = (num*sum_xy - sum_x*sum_y)/denominator;
    *b = (sum_xsquared*sum_y - sum_x*sum_xy)/denominator;


    return FUNC_OK;
}

猜你喜欢

转载自blog.csdn.net/danxibaoxxx/article/details/81190241
今日推荐