当前位置: 首页 > ds >正文

Eigen 库实现最小二乘算法(Least Squares)

一、最小二乘法基本原理

给定一个超定方程组 A x = b Ax = b Ax=b,当 A ∈ R m × n , m > n A \in \mathbb{R}^{m \times n}, m > n ARm×n,m>n 时,一般无法精确解出 x x x。因此我们寻找一个使残差 ∥ A x − b ∥ 2 2 \|Ax - b\|_2^2 Axb22 最小的解。

其解析解为:

x = ( A T A ) − 1 A T b x = (A^T A)^{-1} A^T b x=(ATA)1ATb

或者使用更稳定的方式:

  • QR分解
  • SVD分解

二、基于 Eigen 的最小二乘解法

方法1:正规方程(Normal Equation)

#include <Eigen/Dense>
#include <iostream>
using namespace Eigen;int main() {MatrixXd A(4, 2);  // 超定方程,4个点拟合一个一次函数 y = ax + bVectorXd b(4);A << 1, 1,2, 1,3, 1,4, 1;b << 6, 5, 7, 10;// 求解 x = (A^T A)^{-1} A^T bVector2d x = (A.transpose() * A).inverse() * A.transpose() * b;std::cout << "Least Squares Solution (a, b): " << x.transpose() << std::endl;return 0;
}

说明:适用于小规模数据,数值不稳定时不推荐。


方法2:QR 分解法(推荐)

Vector2d x = A.colPivHouseholderQr().solve(b);

更稳定可靠,效率也好。支持大型数据处理。


方法3:SVD 分解(最稳健)

Vector2d x = A.bdcSvd(ComputeThinU | ComputeThinV).solve(b);

适合矩阵奇异或接近奇异的情况(如点分布退化等)。


三、完整最小二乘拟合一元线性函数示例(y = ax + b)

#include <Eigen/Dense>
#include <iostream>
#include <vector>int main() {using namespace Eigen;std::vector<double> x_data = {1, 2, 3, 4, 5};std::vector<double> y_data = {2.2, 2.8, 3.6, 4.5, 5.1};const int N = x_data.size();MatrixXd A(N, 2);VectorXd b(N);for (int i = 0; i < N; ++i) {A(i, 0) = x_data[i];A(i, 1) = 1.0;       // 常数项b(i)    = y_data[i];}// 求解最小二乘(推荐 QR)Vector2d result = A.colPivHouseholderQr().solve(b);std::cout << "拟合直线: y = " << result(0) << " * x + " << result(1) << std::endl;return 0;
}

四、拓展:非线性最小二乘可通过迭代(如高斯-牛顿)

如拟合非线性模型 y = exp ⁡ ( a x + b ) y = \exp(ax + b) y=exp(ax+b),需使用迭代优化,比如:

  • 高斯-牛顿法
  • Levenberg-Marquardt 法(Ceres/GTSAM 使用)

Eigen 本身不含自动求导工具,但可以配合手动 Jacobian 实现。

http://www.xdnf.cn/news/8979.html

相关文章:

  • 如何用AI实现需求分析
  • Newtonsoft Json序列化数据不序列化默认数据
  • LeetCode 1345 跳跃游戏 IV
  • CentOS7更新 GLIBC 2.25
  • 基于亚博K210开发板——六轴姿态传感器水平测试板验证
  • Java集合使用中的常见错误与最佳实践
  • Oracle 如何实现AI自然语言查询
  • MySQL索引深度解析:从原理到实践
  • STM32的内部FLASH
  • JVM相关
  • 【MPC控制 - 从ACC到自动驾驶】4 MPC的“实战演练”:ACC Simulink仿真与结果深度解读
  • 【Linux】磁盘空间不足
  • vite+vue2安装步骤
  • 使用大模型预测亚急性脊髓联合变性(SCD)的技术方案大纲
  • x星球请求返回值加密
  • 《计算机组成原理》——第二章-10 现代计算机的总线结构
  • 大模型记忆法
  • 嵌入式Linux:子进程执行新程序
  • 智慧校园管理系统
  • openwrt虚拟机安装调试
  • 深入解析Java组合模式:构建灵活树形结构的艺术
  • python小知识 查看项目所有的依赖包
  • 强化学习的前世今生(二)
  • JWT令牌详解及Java中的使用实战
  • 2025郑州台球展/台球厅地毯展/台球灯展/河南台球器材展
  • 字节跳动2025年校招笔试手撕真题教程(一)
  • 第八课 SPSS 在医学影像分析中的基本应用场景
  • Leetcode 587. 安装栅栏
  • 「OC」源码学习——关联属性再探索
  • 代码随想录---贪心篇