zoukankan      html  css  js  c++  java
  • Householder变换

    整理自:《数值线性代数(徐树方)》

    Householder变换是一种能将n维向量x变换到任一n维向量y的正交变换,由于从几何上看Householder变换通过xy之间的垂直平分面将x“反射”到y,因此Householder变换又叫镜面变换;

    Householder的主要应用在于它能够将x变换成任意一个等长的若干个分量为0的向量(这种向量具有某些良好的性质,尤其是在最小二乘法的正交化解法的应用),只需要对变换后的向量再进行一次Householder变换,就能变回x

    本篇先介绍Householder变换的定义及其性质,再推导一种用于求Householder变换的数值化方法

    一、Householder变换及其性质

        定义:

        Householder变换:设ω∈Rn, ||ω||2=1,定义:

                       H=I-2ωωT(H∈Rn×n)                                                                          公式1

        称H为Householder变换(矩阵)

        性质:

        1.对称性:HT=H

        2.正交性:HTH=I

        3.对合性:HH=I

        4.反射性:对任意x∈Rn,Hxx关于ω的垂直超平面(即span{ω})的镜面反射。

                                                                

        性质1,2,3不难证,这里仅证性质4:

        设x∈Rn,则可以将x表示为x=uω,其中u∈span{ω}(即ω的正交补空间),α∈Rn,即有:Hx=H(uω)=(I-2ωωT)u+(I-2ωωTω=uω,得证。

        从以上证明过程可以看出,H将x沿ω的分量映射到超平面的反方向,而没有改变垂直ω(即沿超平面方向)的分量方向,因此导致x经过H变换以后变为了关于ω的垂直超平面的镜面反射,实际上,以上证明的本质可以概括为H的以下两个性质,即:Hu=u,Hω=-ω。

        (由于Householder变换的反射性,Householder变换又被称为初等反射矩阵或镜像变换)

        定理1:

                给定任何两个向量xy(x,y∈Rn且||x||2=||y||2),都可以找到一个Householder变换H,使得y=Hx

        采用构造性的方法证明:令ω=(x-y)/||x-y||2,H=I-2ωωT,即有y=Hx,得证。

        由定理1自然得到定理2

        定理2

               设0≠x∈Rn, 则可构造单位向量ω∈Rn,使得由公式1定义的Householder变换H满足Hxe1,其中α=±||x||2

    二、Householder算法

        正如定理2显示的那样,Householder变换的主要用途在于,它能和Guass变换一样,通过选取指定的单位向量,把一个给定向量的若干个分量置为0,Householder算法就是用来寻找满足定理2的H,即对任意一个0≠x∈Rn,找到一个H满足Hxe1。虽然ω和H的求法定理1已揭示出,但是Householder算法从数值计算的角度,考虑到计算误差和时间、空间复杂度的问题,对求解过程做了一定的修改,使得求解算法更加高效准确。

        接下来我们推导求解将x变为||x||2e1的Householder变换的算法:

        首先,从定理1定理2可推出,ωH的基本构造方法:

        (1) 计算v=x±||x||2e1     

        (2)计算ω=v/||v||2

        (3)计算H=I-2ωωT

        以上方法从数学的角度非常美观,但是从计算机的角度,存在着计算误差以及时间、空间复杂度的问题,下面就对其缺点以及解决方法作一定的分析,在最后贴出解决了这些问题的最终版算法。

        在步骤(1)中,通常选取v=x-||x||2e1,但这样在计算时可能会遇到一个问题:如果x1为正 向量且和||x||2大小上比较接近,计算x1-||x||2时,会严重地损失有效数字,甚至造成下溢。解决地方法就是对该式做一定的等价变形,即:

                       v1=x1-||x||2=(x12-||x||22)/(x1+||x||2)=-(x22+x32+...+xn2)/(x1+||x||2)       公式2

        (只有在x1为正时才需要做这种变换,当x1为负时x1-||x||2不存在精度损失的问题)

         在步骤(2)中,需要计算||v||2,其中包含开方运算,开方运算的效率较低,要尽量避免,将(2)式直接代入(3)式,恰好可以直接避免开方运算:

                      H=I-2ωωT=I-2vvT/vTv                                                                       公式3

         整理公式3,令β=2/vTv,即:

                      H=I-βvvT                                                                                           公式4

        此外,为了避免x2过大造成的上溢出问题,我们在步骤(1)之前令x=x/||x||,利用规格化后的x来求β和v,这样相当于在原来的v之前乘了1/||x||,注意,这样做对最终的H没有影响,因为1/||x||v与v的单位化向量相同,即vvT/vTv 不变。

        此外,我们可以在步骤(3)之后,令v=v/v1,这样做可以使v1=1,v的后n-1个分量正好存在x的后n-1个为0的向量之中(v1=1不需保存),但是注意要将β做相应调整。

        综合以上改进,最终的算法为:

                                                

        最后补充两点:

        利用Householder变换在一个向量中引入零元素,并不局限于Hxe1的形式,例如,我们需要将x的第k+1至j个元素置为0,那么可以构造y=(x1,  x2, ...xk-1, α, 0, 0...0 ,xj+1,...xn),(a=Σji=kxi2)注意到||x||2=||y||2

    再构造v=x-yv=(0,...0,xk-a,xk+1,...xj,0,...0)即可。

        注意到算法1中,并没有直接求出H,而是给出了β和v,这样做的原因使求vvT的成本太大,实际上,不需要求出H,而利用H=I-βvvT来进行变换更有效率,例如对矩阵A做Householder变换,可以通过以下公式进行:

                      HA=(I-βvvT )A=A-βv(ATv)2=A-vw                                                      公式5

        其中w=βATv,总的运算量为4mn

      

         

  • 相关阅读:
    【Java EE 学习 36】【struts2】【struts2系统验证】【struts2 ognl值栈】【struts2 ongl标签】【struts2 UI标签】【struts2模型驱动和令牌机制】
    【Java EE 学习 35 下】【struts2】【struts2文件上传】【struts2自定义拦截器】【struts2手动验证】
    【Java EE 学习 35 上】【strus2】【类型转换器】【struts2和Servlet API解耦】【国际化问题】【资源文件乱码问题已经解决】
    【Java EE 学习 34】【struts2学习第一天】
    【JavaScript中的正则表达式】
    【Java EE 学习 33 下】【validate表单验证插件】
    【Java EE 学习 33 上】【JQuery样式操作】【JQuery中的Ajax操作】【JQuery中的XML操作】
    【Java EE 学习 32 下】【JQuery】【JQuey中的DOM操作】
    【Java EE 学习 32 上】【JQuery】【选择器】
    【Java EE 学习 31】【JavaScript基础增强】【Ajax基础】【Json基础】
  • 原文地址:https://www.cnblogs.com/reasno/p/9606224.html
Copyright © 2011-2022 走看看