[嵌入式C编程与固件开发] 软件滤波中的最小二乘法

[复制链接]
jerry尧 发表于 2025-8-9 23:11 | 显示全部楼层 |阅读模式
本帖最后由 jerry尧 于 2025-8-9 23:13 编辑

最小二乘法(Least Squares Method)是一种数学优化技术,用于通过最小化误差的平方和来拟合数据与模型之间的关系。它广泛应用于回归分析、曲线拟合以及参数估计等领域。
给定一组数据点 (xi,yi)(xi​,yi​) 和一个模型 y=f(x,β)y=f(x,β)(其中 ββ 是待估参数)最小二乘法的目标是找到参数 ββ,使得模型预测值与实际观测值之间的残差平方和(RSS)最小:
RSS=∑i=1n(yi−f(xi,β))2RSS=i=1∑n​(yi​−f(xi​,β))2
线性最小二乘法(最常见形式)
当模型是参数的线性组合时(如线性回归),即 f(x,β)=β0+β1xf(x,β)=β0​+β1​x问题简化为求解以下正规方程组(Normal Equations):
XTXβ=XTyXTXβ=XTy
其中:
  • XX 是设计矩阵(包含 xixi​ 和常数项),
  • yy 是观测值向量,
  • ββ 是待求参数向量。

解为:
β=(XTX)−1XTyβ=(XTX)−1XTy
  • 无偏性:若误差满足零均值、同方差且不相关,最小二乘估计是无偏的。
  • 最优性(高斯-马尔可夫定理):在满足经典假设下,最小二乘估计是最佳线性无偏估计(BLUE)。
  • 对异常值敏感:平方误差会放大离群点的影响,可用稳健回归(如RANSAC)改进。


代码实现

// 最小二乘法拟合函数
void leastSquaresFit(double x[], double y[], int n, double *slope, double *intercept)
{
    double sumX = 0.0, sumY = 0.0, sumXY = 0.0, sumX2 = 0.0;
       // 计算各项和
   for (int i = 0; i < n; i++)
{
        sumX += x;
       sumY += y;
        sumXY += x * y;
       sumX2 += x * x;
   }
       // 计算斜率和截距
   double denominator = n * sumX2 - sumX * sumX;
   if (denominator != 0.0)
{
       *slope = (n * sumXY - sumX * sumY) / denominator;
       *intercept = (sumY - *slope * sumX) / n;
   }
else
{
       // 处理垂直线的情况
       *slope = 0.0;
       *intercept = 0.0;  
  }
}
非线性最小二乘
当模型 f(x,β)f(x,β) 非线性时,需迭代方法(如高斯-牛顿法、Levenberg-Marquardt算法)逼近最优解。
应用场景
  • 线性/非线性回归
  • 数据拟合(如指数、多项式拟合)
  • 机器学习(线性回归、正则化变体如岭回归)



您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

70

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

46

主题

70

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部