改进的格拉姆-施密特正交化(modified Gram-Schmidt Process)

        最近在重新学习线性代数,学习的教材是MIT Gilbert Strang 教授的《INTRODUCTION TO LINEAR ALGEBRA》,在第4.4章节格拉姆-施密特正交化时,书中章节末尾介绍了一种改进的格拉姆-施密特正交化方法,但书中给出了公式,省略了很多细节,给学习理解造成了一定的难度,为自己今后或者遇到同样问题的朋友记录一下公式的来由。

        首先,介绍一下格拉姆施密特正交化的思想和方法。介绍正交化还得说说投影矩阵,我们在用最小二乘法解方程组的最优解的时候,由于Ax=b,b一般情况下,b并不一定存在于A的列空间中,这种情况下Ax=b其实是无解的,因为找不到列空间内合适的线性组合使其结果为b。这是后最小二乘法就派上用场了,最小二乘法的思想是,既然Ax=b无解,我们在列空间内找到一个向量p,下面这个方程组一定有解A\widehat{x}=p,那么怎么寻找p呢,最小二乘选取的p是使得||e||=||b-p||误差最小的那个p,其实这个p就是b在A的列空间上的投影。前面说了那么一大堆就是为了引出投影,那这个投影是怎么做呢,推导这里我就省略了,直接给出投影矩阵P

        在线上的投影矩阵,这是后a是线上的向量:P=\frac{aa^{T}}{a^{T}a},p=\frac{aa^{T}}{a^{T}a}b,\widehat{x}=\frac{a^{T}b}{a^{T}a}

        在子空间上的投影矩阵:P=A(A^{T}A)^{-1}A^{T},p=A(A^{T}A)^{-1}A^{T}b,A^{T}A\widehat{x}=A^{T}b

        知道投影矩阵之后,那么为什么要正交化呢,有什么好处呢?投影矩阵中包含(A^{T}A)^{-1},使得普通的投影矩阵并不是那么漂亮,这一向给求解带来了很大的麻烦,那么能不能消除它呢?答案就是找到A列空间的一组标准正交基Q,因为对于标准正交基有如下性质Q^{T}Q=I,如果我们能找到列空间的标准正交基(格拉姆-施密特正交化要做的事情),那么上面的投影矩阵P中A用Q代替,表达式变为:P=Q(Q^{T}Q)^{-1}Q^{T}=QQ^{T},神奇的发现投影矩阵中不好的部分不见了。这也是标准正交令人着迷的地方。那么怎么寻找标准正交基呢,我们知道一个向量子空间中有多种可能的标准正交基,格拉姆-施密特就为我们提供了一种寻找标准正交基的方法,思想很简单:假设矩阵M=( a b c),A列空间的第一列为第一个标准正交基向量的方向,令A=a,通过除去向量的模得到第一个基向量q_{1} =A/||A||,那么第二基向量怎么求呢,答案就是通过投影得到bA上的投影\frac{A^{T}b}{A^{T}A}A,根据投影的知识知道这是后有B=b-\frac{A^{T}b}{A^{T}A}A是垂直于A的,那么我们得到第二个基向量q_{2}=B/||B||,如果M矩阵还有第3个列向量c,那我们如何得到q_{3}呢?思想和得到q_{2}的思想一样,对cAB上做投影得到C=c-\frac{A^{T}c}{A^{T}A}A-\frac{B^{T}c}{B^{T}B}B,q_{3}=C/||C||, 重复第二步骤就可以得到所有的n个正交基向量,这就是格拉姆-施密特正交化。

        格拉姆-施密特正交化是A的一个因子分解,叫QR分解,A=QR,Q就是格拉姆-施密特正交化的标准正交矩阵,R是一个上3角矩阵,假设M=( a b c),M的QR分解是如下形式:

        \begin{bmatrix} a& b& c \end{bmatrix}=\begin{bmatrix} q_{1}& q_{2}& q_{3} \end{bmatrix}\begin{bmatrix} q_{1}^{T}a &q_{1}^{T}b &q_{1}^{T}c \\ & q_{2}^{T}b&q_{2}^{T}c \\ & &q_{3}^{T}c \end{bmatrix}

        为什么R会是这样的上3角矩阵呢,原因是格拉姆-施密特正交化的过程,a在和q_{1}方向一致,所以在q_{2},q_{3}上投影为0,同样b只在上q_{1},q_{2}有分量在q_{3}上没有分量,格拉姆-施密特正交化的过程保证了A前面的列不会在后面的正交向量方向有分量,因为后面的正交分量始终是垂直于前面的列构成的向量子空间,也就是说与前面的列向量都垂直。下面我们推导一下q_{1}^{T}b就是b在q_{1}方向投影的模长,这对后面理解改进的格拉姆-施密特正交化至关重要。

        b在q_{1}上的投影由线上的投影矩阵知道:

       p=\frac{q_{1}q_{1}^{T}}{q_{1}^{T}q_{1}}b=q_{1}q_{1}^{T}b,||p||=\sqrt{p^{T}p}=\sqrt{(q_{1}q_{1}^{T}b)^{T}(q_{1}q_{1}^{T}b)}=\sqrt{(q_{1}^{T}b)^2q_{1}^{T}q_{1}}=q_{1}^Tb,可以推论R中其他项也是对于的向量在正交基向量上投影的模长。

        前面的准备知识够了,接下来,我们可以搬出改进的格拉姆-施密特正交化的公式了A是mxn阶矩阵:

        r_{jj}=\sqrt{\sum_{i=1}^{m}v_{ij}}   

        q_{ij}=\frac{v_{ij}}{r_{jj}}     

        下面的公式从v=A_{j}开始计算A_{j}q_{1}...q_{j-1}上的模长(A_{j}q_{j}上的模场由r_{jj}已经求得):

        r_{kj}=\sum_{i=1}^{m}q_{ik}v{ij}

        v_{ij} = v_{ij}-q_{ik}r_{kj}     

        改进的格拉姆-施密特正交化就是上面的4个公式,下面我们就分析下这四个公式各自的含义:

        r_{jj}就是QR分解中R对角线上的值,如果对应上面举例的QR分解,那么r_{11} = q_{1}^{T}a,前面已经证明了R中的项是对应向量在正交基向量上投影的模长,v_{:j}A_{j}q_{i}方向上的投影,r_{jj}的表达式对应的正是A_{j}q_{i}方向上的投影的模长。

        q_{ij}q_{i}的第j个元素值,来源于前面的格拉姆-施密特正交化q_{1}=A_{1}/||A_{1}||,q_{2}=B/||B||,q_{3}=C/||C||

        r_{kj}是QR分解中对角线之外的元素表达式,像q_{1}^{T}b,q_{1}^{T}c的向量内积展开,这里有个小小的拐弯要知道,原来R矩阵第j列的元素对应的是q_{1}^{T}A_{j},q_{2}^{T}A_{j},...,q_{j}^{T}A_{j},而这里通过迭代计算的方式,第一步v=A_{j}r_{1j}=q_{1}^{T}A_{j}与元表达式一致,但是从第二次迭代开始,由第四个公式知道,这时v=A_{j}-q_{1}r_{1j}=A_{j}-q_{1}q_{1}^{T}A_{j},这时候的r_{2j}=q_{2}^{T}(A_{j}-q_{1}q_{1}^{T}A_{j})=q_{2}^{T}A_{j}-q_{2}^{T}q_{1}q_{1}^{T}A_{j}=q_{2}^{T}A_{j},因为q_{2}^{T}q_{1}q_{1}^{T}A_{j}=0,从几何上理解q_{1}q_{2}正交,A_{j}q_{1}上的分量不会对A_{j}q_{2}上的分量的模长产生贡献,或者说A_{j}q_{1}上的分量在q_{2}上的投影为0,在计算A_{j}q_{2}的投影时,可以先将A_{j}q_{1}上的分量减掉。

        v_{ij}就是在迭代过程中从A_{j}减去前面计算过的q_{k}方向分量的剩余补向量。

        下面我们用改进的施密特正交化做一下上面介绍施密特正交化对M=(a b c)矩阵做的事情,直观的看看它和标准的施密特正交化的不同之处:

        A=a,q_{1}=A/||A|| 

        B=b-(q_{1}^{T}b)q_{1},q_{2}=B/||B||

        C^{*}=c-(q_{1}^{T}c)q_{1},C=C^{*}-(q_{2}^{T}C^{*})q_{2},q_{3}=C/||C||

        摘抄一段书上改进的格莱姆-施密特正交化的matlab代码:

         for j=1:n                      %modified Gram-Schmidt
             v=A(:,j);                  %v begins as column j of A
             for i=1:j-1               %columns up to j-1, already settled in Q 
                 R(i,j)=Q(:,i)'*v;   %compute r_{ij}=q_{i}^{T}a_{j} 
                 v=v-R(i,j)*Q(:,i); %subract the projection (q_{i}^{T}a_{j})q_{i}=(q_{i}^{T}v)q_{i} 
             end                        %v is now perpendicular to all of q_{1},...,q_{j-1}
             R(j,j)=norm(v);       %diagonal entries of R 
             Q(:,j)=v/R(j,j);         %normalize v to be the next unit vector q_{j}
         end

        

                                        

    

你可能感兴趣的:(数学,线性代数,施密特正交化,投影矩阵,线性代数)