0. 为什么要用QR分解
- 情况1:A是方阵,m=n
- 情况2:A是over-determined的,m>n
- 情况3:A是under-determined的,m<n
在[数值计算] 条件数的例子2里,遇到的情况1(A是方阵),通过构造拉格朗日插值来使得对A求逆足够稳定。对于一般的情况下,解决思路是使用LU(LUP)分解来解决稳定性问题,在前一篇文中已经简介过了[数值计算] LU分解、LUP分解、Cholesky分解。
对于后两种情况, [数值计算] 数据拟合——线性最小二乘法 分析了用正规方程组求解over-determined以及under-determined的问题。但在文中也提到了,对于over-determined的线性最小二乘问题,正规方程组是不稳定的,通常需要用QR分解来处理:
理论很美好,在小数据量的时候没问题,然而直接使用正规方程组求解会在数据量大(e.g. data size > 100)的时候不稳定numerically unstable。原因是 需要对求逆,而A我们都知道是Vandermonde矩阵的一部分,本身就是poorly conditioned,而
QR分解,这也是Python MATLAB求解 线性最小二乘 问题的方法。只会更糟糕。解决的方法是使用
1. QR分解
1.1 定义
一个矩阵
-
是正交矩阵
-
-
是上三角矩阵
1.2 正交矩阵的性质
-
- 左乘一个正交矩阵对欧式范数的结果不影响(在下面证明eq.2的时候会用到)
1.3 从QR分解角度看线性最小二乘
对于一个over-determined线性最小二乘问题
这里
如果把
可以看到,我们只能最小化前一部分
1.4 计算QR分解的方法
一共有三种:
- Gram–Schmidt Orthogonalization
- Householder Triangularization
- Givens Rotations
1.5 Gram–Schmidt Orthogonalization
1.5.1 Reduced QR分解
GSO构建正交矩阵
这个方法生成的
![b19bfb7bbf425fc6f3a1521a55e85407.png](https://img-blog.csdnimg.cn/img_convert/b19bfb7bbf425fc6f3a1521a55e85407.png)
Reduced QR分解同样可以求解over-determined线性最小二乘问题。形式类似Full QR分解:
其中
1.5.2 Full QR分解
为了实现定义中的完整的QR分解,需要把上面生成Q中的n个基拓展成m个互相正交的基。但此处并没有对额外的m-n个基的顺序有特殊要求,因此任意一种顺序都可以。另外还需要把
在Python中,Reduced QR分解和Full QR分解对应于
q
1.5.3 Classic Gram–Schmidt Orthogonalization算法 CGSO
观察Eq.4可以发现,其实每一步迭代都只有一个
因此
整理上面计算
![c470e4483aac86a7e109743f540eea2e.png](https://img-blog.csdnimg.cn/img_convert/c470e4483aac86a7e109743f540eea2e.png)
观察算法过程,可以发现,唯一可能在理论上出问题的情况就是,出现某个
1.5.4 Modified Gram–Schmidt Orthogonalization算法 MGSO
由于CGSO对舍入误差很敏感,容易导致生成的基
![9d47b7cb6718b467c8c2d9dd1e251551.png](https://img-blog.csdnimg.cn/img_convert/9d47b7cb6718b467c8c2d9dd1e251551.png)
但是改进之后稳定性会好很多。从实际计算步骤上来看,CGSO和MGSO的区别在于,CGSO中,每次迭代新的一列
这样做的好处是:误差的传递是局部的。比如计算
直观理解参考下面这张图,在三维xyz坐标系里,
![bf17da9d431ff444a932c5d8c220ba77.png](https://img-blog.csdnimg.cn/img_convert/bf17da9d431ff444a932c5d8c220ba77.png)
公式上计算这些误差参考The modified Gram-Schmidt procedure:
![661d1412edfb8be7be0eb9e526449751.png](https://img-blog.csdnimg.cn/img_convert/661d1412edfb8be7be0eb9e526449751.png)
1.6 Givens Rotations
1.6.1 Givens Rotation Matrix
1.6.2 Givens Rotations的作用
对于一个矩阵
当
- 如果
,那么设
- 如果
,那么设
不过这个问题基本只有在设计package造轮子的时候才会遇到,所以通常用Eq.10不会引起问题。详见Scientific Computing - Heath的第128页。
另外,在涉及反三角的数值运算的时候,建议使用atan2替代atan,范围更大,更稳定。例如atan2(y,x)会返回一个(x,y)向量和正x轴的夹角。
the difference between atan and atan2 in C++?stackoverflow.com![95206768b56f3390dd80b4e63d790c50.png](https://img-blog.csdnimg.cn/img_convert/95206768b56f3390dd80b4e63d790c50.png)
1.6.3 Givens Rotations 算法
对于一个稠密的矩阵
![91d58a21cd9c7aafb86f6a042cad8550.png](https://img-blog.csdnimg.cn/img_convert/91d58a21cd9c7aafb86f6a042cad8550.png)
注意第三行的循环,j是从大到小的迭代。
1.6.4 Givens Rotations 优势
当A是稠密矩阵,Givens Rotations并没有比另外两种算法更高效,但如果A是稀疏矩阵,那么Givens Rotations大小为0的元素可以直接被忽略。另一个优势是,Givens Rotations更容易并行化,因为Givens Rotations只对两个元素进行操作,处理不同列的时候可以完全的独立。