[Eigen中文文档] 求解线性最小二乘系统

简介: 本文介绍如何使用 Eigen 求解线性最小二乘系统。本文讨论三种方法 SVD 分解、QR 分解和正规方程。其中,SVD 分解通常最准确但最慢,正规方程式最快但最不准确,QR 分解介于两者之间。

文档总目录

英文原文(Solving linear least squares systems)

本页介绍如何使用 Eigen 求解线性最小二乘系统。有一个超定方程组,比如$Ax = b$,没有解。在这种情况下,搜索最接近解的向量 $x$ 是有意义的,使此时的差值 $Ax - b$ 尽可能小。这个 $x$ 称为最小二乘解(如果使用欧几里得范数)。

本页讨论的三种方法是 SVD 分解QR 分解正规方程。其中,SVD 分解通常最准确但最慢,正规方程式最快但最不准确,QR 分解介于两者之间。

SVD 分解

BDCSVD类中的 solve() 方法可以直接用于求解二次线性系统。仅计算奇异值(此类的默认值)是不够的,还需要奇异向量,但稀疏 SVD 分解足以计算最小二乘解:

示例:

#include <iostream>
#include <Eigen/Dense>

int main()
{
   
   Eigen::MatrixXf A = Eigen::MatrixXf::Random(3, 2);
   std::cout << "Here is the matrix A:\n" << A << std::endl;
   Eigen::VectorXf b = Eigen::VectorXf::Random(3);
   std::cout << "Here is the right hand side b:\n" << b << std::endl;
   std::cout << "The least-squares solution is:\n"
        << A.template bdcSvd<Eigen::ComputeThinU | Eigen::ComputeThinV>().solve(b) << std::endl;
}

输出:

Here is the matrix A:
  0.68  0.597
-0.211  0.823
 0.566 -0.605
Here is the right hand side b:
 -0.33
 0.536
-0.444
The least-squares solution is:
-0.67
0.314

这是 4.1 线性代数与分解中的示例,如果只需要解决最小二乘问题,但对 SVD 本身不感兴趣,则可以使用更快的替代方法 CompleteOrthogonalDecomposition

QR 分解

QR 分解类中的 solve() 方法也可以计算最小二乘解。

共有三个 QR 分解类:HouseholderQR(无旋转,快速但不稳定,如果矩阵不是满秩),ColPivHouseholderQR(列旋转,因此有点慢但更稳定)和FullPivHouseholderQR(完全旋转,比ColPivHouseholderQR更慢更稳定)。如下是一个列旋转的例子:

MatrixXf A = MatrixXf::Random(3, 2);
VectorXf b = VectorXf::Random(3);
cout << "The solution using the QR decomposition is:\n"
     << A.colPivHouseholderQr().solve(b) << endl;

输出:

The solution using the QR decomposition is:
-0.67
0.314

正规方程

求 $Ax = b$ 的最小二乘解等同于求解正规方程 $A^T Ax = A^T b$。

示例如下:

MatrixXf A = MatrixXf::Random(3, 2);
VectorXf b = VectorXf::Random(3);
cout << "The solution using normal equations is:\n"
     << (A.transpose() * A).ldlt().solve(A.transpose() * b) << endl;

输出:

The solution using normal equations is:
-0.67
0.314

这种方法通常是最快的,尤其是当 $A$ “又高又瘦”的时候。但是,即使矩阵 $A$ 有轻微病态,这也不是一个好方法,因为 $A^TA$ 的条件数是 $A$ 的条件数的平方。这意味着与上面提到的更稳定的方法相比,使用正规方程式会损失大约两倍的精度。

相关文章
|
XML 并行计算 算法
[Eigen中文文档] 求解稀疏线性系统
在Eigen中,有多种方法可用于求解稀疏系数矩阵的线性系统。由于此类矩阵的特殊表示,必须特别小心以获得良好的性能。本文列出了Eigen中可用的稀疏求解器。还介绍了所有这些线性求解器共同的主要步骤。根据矩阵的属性、所需的准确度,最终用户可以调整这些步骤以提高其代码的性能。请注意,并不需要深入了解这些步骤背后的内容:最后一节介绍了一个基础例程,可轻松使用以获取所有可用求解器的性能洞察。
335 0
|
缓存 测试技术 编译器
[Eigen中文文档] 稠密矩阵分解函数对比
本文介绍了 Eigen 为各种方阵和过约束问题提供的稠密矩阵分解的速度比较。
130 0
|
6月前
|
算法 Python
Python中的Lasso回归之最小角算法LARS
Python中的Lasso回归之最小角算法LARS
|
6月前
|
机器学习/深度学习 算法 大数据
基于PyTorch对凸函数采用SGD算法优化实例(附源码)
基于PyTorch对凸函数采用SGD算法优化实例(附源码)
105 3
|
6月前
|
数据可视化
R语言最优化问题中的共轭函数
R语言最优化问题中的共轭函数
|
6月前
|
机器学习/深度学习 算法 数据可视化
R语言用标准最小二乘OLS,广义相加模型GAM ,样条函数进行逻辑回归LOGISTIC分类
R语言用标准最小二乘OLS,广义相加模型GAM ,样条函数进行逻辑回归LOGISTIC分类
|
存储
[Eigen中文文档] 就地矩阵分解
从 Eigen 3.3 开始,LU、Cholesky 和 QR 分解可以就地操作,即直接在给定的输入矩阵内操作。当处理大矩阵时,或者当可用内存非常有限(嵌入式系统)时,此功能特别有用。
105 0
[Eigen中文文档] 无矩阵求解器
本文介绍Eigen的无矩阵求解器。
142 0
|
测试技术
[Eigen中文文档] 线性代数与分解
本节将说明如何求解线性系统,计算各种分解,如 LU、QR、SVD、特征分解……
225 0
|
机器学习/深度学习 Python
Lesson 2. 矩阵运算基础、矩阵求导与最小二乘法-1
Lesson 2. 矩阵运算基础、矩阵求导与最小二乘法-1