施密特正交化(Gram-Schmidt Orthogonalization)

article/2025/10/27 13:16:08

目录

  • 1 Gram-Schmidt的计算公式推导
  • 2 Gram-Schmidt的意义
  • 3 Modified Gram-Schmidt (以算法模式计算正交向量)
    • 3.1 Modified G-S会出现的问题:当矩阵开始存在微小误差时,会在运算过程中不断累积误差,导致越算越不准确,以至于计算所得的基不正交
  • 4 Stable Gram-Schmidt
    • 4.1 G-S 的复杂度(计算量)
    • 4.2 使用SGS算法解决误差问题
    • 4.3 MGS和SGS运算的区别在哪里?
  • 5 GS和LS(最小二乘法)
  • 6 参考资料

注:本博文为本人阅读论文、文章后的原创笔记,未经授权不允许任何转载或商用行为,否则一经发现本人保留追责权利。有问题可留言联系,欢迎指摘批评,共同进步!!!

1 Gram-Schmidt的计算公式推导

问 :以三维情况为例,已知三个线性无关的向量 a \mathbf{a} a b \mathbf{b} b c \mathbf{c} c,如何能找到三个正交向量 α 1 \bm{\alpha_1} α1 α 2 \bm{\alpha_2} α2 α 3 \bm{\alpha_3} α3,在归一化后能形成标准正交基: e 1 \mathbf{e_1} e1 e 2 \mathbf{e_2} e2 e 3 \mathbf{e_3} e3 ?请添加图片描述

公式:

  • 对三个线性无关的向量 a \mathbf{a} a b \mathbf{b} b c \mathbf{c} c进行Gram-Schmidt正交化,所得的正交向量 α 1 \bm{\alpha_1} α1 α 2 \bm{\alpha_2} α2 α 3 \bm{\alpha_3} α3分别为:
    α 1 = a α 2 = b − b α 1 ∣ α 1 ∣ 2 α 1 α 3 = c − c α 1 ∣ α 1 ∣ 2 α 1 − c α 2 ∣ α 2 ∣ 2 α 2 \begin{aligned} \bm{\alpha_1} &= \mathbf{a} \\ \bm{\alpha_2} &= \mathbf{b}-\frac{\mathbf{b} \ \bm{\alpha_1}}{|\bm{\alpha_1}|^2} \ \bm{\alpha_1} \\ \bm{\alpha_3} &= \mathbf{c}-\frac{\mathbf{c} \ \bm{\alpha_1}}{|\bm{\alpha_1}|^2} \ \bm{\alpha_1}-\frac{\mathbf{c} \ \bm{\alpha_2}}{|\bm{\alpha_2}|^2} \ \bm{\alpha_2} \end{aligned} α1α2α3=a=bα12b α1 α1=cα12c α1 α1α22c α2 α2
  • n n n个线性无关的向量 a \mathbf{a} a b \mathbf{b} b ⋯ \cdots x \mathbf{x} x进行Gram-Schmidt正交化,所得的正交向量 α 1 \bm{\alpha_1} α1 α 2 \bm{\alpha_2} α2 ⋯ \cdots α n \bm{\alpha_n} αn分别为:
    α 1 = a α 2 = b − b α 1 ∣ α 1 ∣ 2 α 1 α 3 = c − c α 1 ∣ α 1 ∣ 2 α 1 − c α 2 ∣ α 2 ∣ 2 α 2 ⋮ α n = x − x α 1 ∣ α 1 ∣ 2 α 1 − x α 2 ∣ α 2 ∣ 2 α 2 − ⋯ − x α n − 1 ∣ α n − 1 ∣ 2 α n − 1 \begin{aligned} \bm{\alpha_1} &= \mathbf{a} \\ \bm{\alpha_2} &= \mathbf{b}-\frac{\mathbf{b} \ \bm{\alpha_1}}{|\bm{\alpha_1}|^2} \ \bm{\alpha_1} \\ \bm{\alpha_3} &= \mathbf{c}-\frac{\mathbf{c} \ \bm{\alpha_1}}{|\bm{\alpha_1}|^2} \ \bm{\alpha_1}-\frac{\mathbf{c} \ \bm{\alpha_2}}{|\bm{\alpha_2}|^2} \ \bm{\alpha_2} \\ \vdots \\ \bm{\alpha_n} &= \mathbf{x}-\frac{\mathbf{x} \ \bm{\alpha_1}}{|\bm{\alpha_1}|^2} \ \bm{\alpha_1}-\frac{\mathbf{x} \ \bm{\alpha_2}}{|\bm{\alpha_2}|^2} \ \bm{\alpha_2} \ - \ \cdots - \ \frac{\mathbf{x} \ \bm{\alpha_{n-1}}}{|\bm{\alpha_{n-1}}|^2} \ \bm{\alpha_{n-1}} \end{aligned} α1α2α3αn=a=bα12b α1 α1=cα12c α1 α1α22c α2 α2=xα12x α1 α1α22x α2 α2   αn12x αn1 αn1
    公式解读:在使用第n个向量计算第n个正交向量时,只要在第n个向量中排除掉前(n-1)个正交向量的组分,就能得到第n个正交向量。

具体推导的图解请参看知乎回答。

2 Gram-Schmidt的意义

非正交基转为正交基,便于表示。
通俗来说,就是将一对歪歪斜斜的基向量掰成标准正交基。(强迫症)

3 Modified Gram-Schmidt (以算法模式计算正交向量)

Gram-Schmidt公式推到中的方法是纯数的方法,但是在数值运算方法中(计算机操作)不会严格按照数学方法来。具体如下所述。

  • 从Gram-Schmidt分解结果可以看出:
    若对线性无关向量组{ w k \mathbf{w_k} wk}进行Schmidt正交化得到标准正交基{ u k \mathbf{u_k} uk},经过移项可得到原向量组 可以表示为标准正交基的线性组合:
    w 1 = r 11 u 1 w 2 = r 21 u 1 + r 22 u 2 ⋮ w L = r L 1 u 1 + r L 2 u 2 + ⋯ + r L L u L \begin{aligned} \mathbf{w_1} &= r_{11} \ \mathbf{u_1} \\ \mathbf{w_2} &= r_{21} \ \mathbf{u_1} + r_{22} \ \mathbf{u_2} \\ &\vdots \\ \mathbf{w_L} &= r_{L1} \ \mathbf{u_1} + r_{L2} \ \mathbf{u_2} + \cdots + r_{LL}\mathbf{u_L} \\ \end{aligned} w1w2wL=r11 u1=r21 u1+r22 u2=rL1 u1+rL2 u2++rLLuL
    因此,要完成正交化分解,我们需要找系数组{ r k r_k rk}和标准正交基{ u k \mathbf{u_k} uk}:
    请添加图片描述

由此,我们看拿出Modified G-S的思想是:
使用第k个线性无关向量组的向量 w k \mathbf{w_k} wk计算第k个正交基 u k \mathbf{u_k} uk时,就是 w k \mathbf{w_k} wk中排除掉前 k − 1 k-1 k1个正交基的组分,剩余的就是 u k \mathbf{u_k} uk的组分,再除以系数即可。

3.1 Modified G-S会出现的问题:当矩阵开始存在微小误差时,会在运算过程中不断累积误差,导致越算越不准确,以至于计算所得的基不正交

  • 情景:假设 e e e是一个接近与0的正数(作为一个微小的初始误差),那么请对矩阵 W = ( 1 1 1 e 0 0 0 e 0 0 0 e ) \mathbf{W}\ = \begin{pmatrix} 1 & 1 & 1\\ e & 0 & 0\\ 0 & e & 0\\ 0 & 0 & e \end{pmatrix} W = 1e0010e0100e 进行Gram-Schmidt正交化:
    请添加图片描述
    此时问题就很明显地体现出来了,向量 u 2 \mathbf{u_2} u2 u 3 \mathbf{u_3} u3明显不正交,没法作为正交基使用。
    问题的原因:误差“e”作为一个很小的误差,在每一次派出组分操作的过程中都被积累起来了(误差积累),导致越往后算越不准确,Gram-Schmidt就失效了。

为了解决这一问题,就有了Stable Gram-Schmidt算法(SGS)。

4 Stable Gram-Schmidt

不同于Modified Gram-Schmidt,SGS算法的核心思想是:
每使用一个线性无关组向量 w k \mathbf{w_k} wk求出一个单位正交基向量 u k \mathbf{u_k} uk,那么剩余的 w k + 1 \mathbf{w_{k+1}} wk+1 w L \mathbf{w_L} wL这些向量都要立即原地减去其中所含的 u k \mathbf{u_k} uk组分,进行更新。

每计算出一个新的单位正交基向量,就当场把剩余线性无关组向量中的此组分排除掉
请添加图片描述

4.1 G-S 的复杂度(计算量)

请添加图片描述

4.2 使用SGS算法解决误差问题

与3.1中的问题一致,使用SGS可以抵消微小误差的影响,算法更具有鲁棒性
请添加图片描述

4.3 MGS和SGS运算的区别在哪里?

我们注意到,使用两种算法计算所得的 u 3 \mathbf{u_3} u3向量时不同的,因此着重比较一下两算法计算 u 3 \mathbf{u_3} u3时的差别:( u 3 = v 3 ∣ ∣ v 3 ∣ ∣ 2 \mathbf{u_3} = \frac{\mathbf{v_3}}{||\mathbf{v_3}||_2} u3=∣∣v32v3)

  1. MGS:(当使用到 w 3 \mathbf{w_3} w3计算 u 3 \mathbf{u_3} u3时,从 w 3 \mathbf{w_3} w3中一次性减去 u 1 \mathbf{u_1} u1 u 2 \mathbf{u_2} u2的组分
    v 3 = w 3 − ( u 1 T w 3 ) u 1 − ( u 2 T w 3 ) u 2 \mathbf{v_3}=\mathbf{w_3}-(\mathbf{u_1^Tw_3})\mathbf{u_1}-(\mathbf{u_2^Tw_3})\mathbf{u_2} v3=w3(u1Tw3)u1(u2Tw3)u2
  2. SGS:(当利用 w 1 \mathbf{w_1} w1求出 u 1 \mathbf{u_1} u1时, w 2 \mathbf{w_2} w2 w 3 \mathbf{w_3} w3都立即减去其中所含的 u 1 \mathbf{u_1} u1组分进行更新;当利用 w 2 n e w \mathbf{w_2^{new}} w2new求出 u 2 \mathbf{u_2} u2时, w 3 n e w \mathbf{w_3^{new}} w3new立即减去其中所含的 u 2 \mathbf{u_2} u2组分进行更新,然后再求出 u 3 \mathbf{u_3} u3
    w 3 n e w = w 3 − ( u 1 T w 3 ) u 1 v 3 = w 3 n e w − ( u 2 T w 3 n e w ) u 2 = ( w 3 − ( u 1 T w 3 ) u 1 ) − ( u 2 T ( w 3 − ( u 1 T w 3 ) u 1 ) ) u 2 = w 3 − ( u 1 T w 3 ) u 1 − ( u 2 T w 3 ) u 2 + ( u 1 T w 3 ) ( u 2 T u 1 ) u 2 \begin{aligned} \mathbf{w_3^{new}} &= \mathbf{w_3}-(\mathbf{u_1^Tw_3})\mathbf{u_1} \\ \mathbf{v_3} &= \mathbf{w_3^{new}}-(\mathbf{u_2^Tw_3^{new}})\mathbf{u_2} \\ &= (\mathbf{w_3}-(\mathbf{u_1^Tw_3})\mathbf{u_1})-(\mathbf{u_2^T(\mathbf{w_3}-(\mathbf{u_1^Tw_3})\mathbf{u_1})})\mathbf{u_2} \\ &= \mathbf{w_3}-(\mathbf{u_1^Tw_3})\mathbf{u_1}-(\mathbf{u_2^Tw_3})\mathbf{u_2} + (\mathbf{u_1^T}\mathbf{w_3})(\mathbf{u_2^T}\mathbf{u_1})\mathbf{u_2} \end{aligned} w3newv3=w3(u1Tw3)u1=w3new(u2Tw3new)u2=(w3(u1Tw3)u1)(u2T(w3(u1Tw3)u1))u2=w3(u1Tw3)u1(u2Tw3)u2+(u1Tw3)(u2Tu1)u2
    由此可见,SGS相较于MGS只是多了最后一项 ( u 1 T w 3 ) ( u 2 T u 1 ) u 2 (\mathbf{u_1^Tw_3})(\mathbf{u_2^Tu_1})\mathbf{u_2} (u1Tw3)(u2Tu1)u2.

从理论上讲, u 1 \mathbf{u_1} u1 u 2 \mathbf{u_2} u2是要正交的,因此 u 2 T u 1 = 0 \mathbf{u_2^Tu_1}=0 u2Tu1=0,最后多出的这一项在理论上就是不存在了。
但是在数值计算(计算机运算)时候存在一定的误差,此时最后这一项不再为0,它的存在也有助于保证在误差存在情况下的稳定性
这一项在理论上不存在,但实际上有利于保持stability.

5 GS和LS(最小二乘法)

在一个 k k k维空间中,我们已知了 k − 1 k-1 k1个单位正交基向量 u 1 \mathbf{u_1} u1 u 2 \mathbf{u_2} u2 ⋯ \cdots u k − 1 \mathbf{u_{k-1}} uk1,这些正交基列向量组成一个矩阵 A \mathbf{A} A={ u 1 u 2 ⋯ u k − 1 \mathbf{u_1} \ \mathbf{u_2} \ \cdots \ \mathbf{u_{k-1}} u1 u2  uk1}。此外,还已知一个在 k k k维上都有分量的向量 w \mathbf{w} w。问:如何找到第 k k k个单位正交基向量 u k \mathbf{u_k} uk呢?

实际上,要找到这最后一个正交向量,我们只需要排除掉向量 w \mathbf{w} w中所含有的前( k − 1 k-1 k1)个单位正交向量组分即可。因此,我们可以找一个系数向量 x \mathbf{x} x,其中包含了前( k − 1 k-1 k1)个单位正交向量组分的系数,在所有可能的向量 x \mathbf{x} x中,我们希望 A x \mathbf{Ax} Ax就是向量 w \mathbf{w} w中前( k − 1 k-1 k1)个单位正交向量组分,因此可以使用LS算法来进行优化:
x ∗ = a r g min ⁡ x ∣ ∣ w − A x ∣ ∣ 2 2 v k = w − A x ∗ u k = v k ∣ ∣ v k ∣ ∣ 2 \mathbf{x^*} = arg\min_{x}||\mathbf{w}-\mathbf{Ax}||_2^2 \\ \mathbf{v_k} = \mathbf{w}-\mathbf{Ax^*} \\ \mathbf{u_k} = \frac{\mathbf{v_k}}{||\mathbf{v_k}||_2} x=argxmin∣∣wAx22vk=wAxuk=∣∣vk2vk
我们来看看这个最优的 x ∗ \mathbf{x^*} x究竟是什么呢?
x ∗ = a r g min ⁡ x ∣ ∣ w − A x ∣ ∣ 2 2 = ( A T A ) A T w k = A T w k = ( u 1 T w k ⋮ u k − 1 T w k ) \begin{aligned} \mathbf{x^*} &= arg\min_{x}||\mathbf{w}-\mathbf{Ax}||_2^2 \\ &=(\mathbf{A^TA})\mathbf{A^Tw_k} \\ &=\mathbf{A^Tw_k} \\ &= \begin{pmatrix} \mathbf{u_1^Tw_k} \\ \vdots \\ \mathbf{u_{k-1}^Tw_k} \end{pmatrix} \end{aligned} x=argxmin∣∣wAx22=(ATA)ATwk=ATwk= u1Twkuk1Twk
果然,最优的 x ∗ \mathbf{x^*} x就是由向量 w \mathbf{w} w中前 k − 1 k-1 k1个单位正交基的组分的系数组成的。这样才能实现 ∣ ∣ w − A x ∣ ∣ 2 2 ||\mathbf{w}-\mathbf{Ax}||_2^2 ∣∣wAx22的最小化,即当向量 w \mathbf{w} w排除到其他组分后,剩下的 u k \mathbf{u_k} uk组分才能恰好与矩阵 A \mathbf{A} A所确定的超平面正交
所以,回到问题,最后一个正交向量是:
v k = w − A x ∗ ( 把组分全部排除掉 ) \mathbf{v_k} = \mathbf{w}-\mathbf{Ax^*}(把组分全部排除掉) vk=wAx(把组分全部排除掉)

6 参考资料

  • 讲解视频:数值线性代数之QR分解 (P3~P5)
  • 知乎回答

http://chatgpt.dhexx.cn/article/B8I4x6Ap.shtml

相关文章

线性代数(9):线性正交

一、正交向量组 (1)定义 若一个非零向量组中的向量两两相交,则称该向量组为正交向量组; 由单个非零向量组成的向量组也为正交向量组 (2)判断 1.2.1 方法 证明两两相交的的方法就是计算向量的内积和是否为…

两个图片叠加在一起css,css实现图片叠加的几种思路(记录笔记)

3、使用div层叠,设置两个div,一个position:relative;一个position:absolute; 就可以实现在div里面显示绝对定位,而不跑出div的层叠div,对于没有固定整个界面的width和height的情况适用。 如果界面的宽高都固定了像素值&#xff0c…

学习如何使用html和css样式将两张图片叠加到另一张图片上,实现微信扫一扫二维码效果

学习如何使用html和css样式将两张图片叠加到另一张图片上&#xff0c;实现微信扫一扫二维码效果 <!DOCTYPE html> <html> <head><meta charset"utf-8"/><link rel"stylesheet" href"menuStyle.css"/><title>…

Matlab中实现两张图片的叠加显示效果

Matlab中实现两张图片的叠加显示效果 1、相同大小图片的叠加显示2、不同大小图片的叠加显示 ** 在matlab中以50%透明度实现两张图图片的叠加显示&#xff0c;图片的大小可以任意设置&#xff0c;不同大小的图片&#xff0c;较小的图片在整幅图中居中显示。** 1、相同大小图片的…

java中将两个图片进行叠加

有个需求要在一张图片上绘制图案&#xff0c;不好实现&#xff0c;就想到把图案的图片直接叠加到背景图片上&#xff0c;试了一下&#xff0c;居然成功了&#xff0c;话不多说&#xff0c;直接看代码&#xff1a; public static void main(String[] args) {try {BufferedImage…

android 中关于两张图片叠加方法(记录)

最近在做一个小的Android项目中遇到一个问题&#xff0c;就是不知道为什么机器输出的分辨率不稳定&#xff0c;总是有几十个像素的误差。导致屏幕适配出现了问题。这次主要记录一下解决思路。 问题就如图 主要是一张背景图 &#xff0c;在背景图指定区域去镶嵌一张指定图片。…

html盒子两个背景图片,css怎么实现两张图片叠加在一起,css添加盒子背景图片

css怎么实现两张图片叠加在一起CSS怎么实现了两张图片的叠加&#xff0c;Css实现了两张图片叠加在一起的方法&#xff1a;可以通过分别设置div与页面左边缘的距离和div与页面上边缘的距离来实现。需要注意的是&#xff0c;两张图片都应该设置position:absolute属性。 环境&…

两个图片叠加在一起css,css两张图片怎么叠加在一起?

css实现两张图片叠加在一起的方法&#xff1a;首先添加2个img标签&#xff1b;然后设置它们的css样式为position:absolute&#xff1b;最后设置其中一个img样式为left:120px即可看见效果。 使用css把两个图片叠加&#xff0c;可以通过position定位属性设置两张图片的位置来实现…

使用Vue将两张图片叠加再保存为一张图片下载

最终效果 将一张课程图片和一张二维码图片叠加&#xff08;网上图片随便乱找&#xff0c;勿对号入座&#xff01;&#xff01;&#xff01;&#xff09; 步骤 先将两张图片使用css进行叠加&#xff0c;然后按照自己需求将图片移动到合理位置要使用到一个插件将两张图片转为…

Unity-两张图片叠加合成一张图片

在做图片分享时&#xff0c;往往需要对图片加上水印或其他标签图片&#xff0c;这个时候就要考虑如何对多张图片进行叠加合成为一张图片。 其实一张图片就是一组单色像素组成的像素矩阵 要对两张图片进行叠加&#xff0c;只需要将背景图片中对应的像素颜色&#xff0c;替换成…

opencv两张图片叠加显示

详细流程&#xff1a; &#xff08;一&#xff09;、线性混合操作&#xff1a;使用addWeighted()1、代码2、说明3、图片效果 &#xff08;二&#xff09;、使用roi和mask方式1、代码2、说明3、图片效果 &#xff08;一&#xff09;、线性混合操作&#xff1a;使用addWeighted()…

html怎么使两张照片重叠,怎样把两张图片叠加在一起?

用手机后期的“双重曝光”功能&#xff0c;可以实现将两张图片叠加的效果&#xff0c;操作非常简单。比如&#xff1a;让人物剪影站在海面的效果 是由一张“海面背景图人物剪影”&#xff0c;两张图片合成&#xff1a; 为了让人物看上去更融入环境&#xff0c;后期加上“人物倒…

第7章第23节:双图排版:两张图片的错位叠加 [PowerPoint精美幻灯片实战教程]

本节演示图片错位叠加的排版方式,首先在此处按下并向左上方拖动,将图片移到另一张图片的上方。 在此处按下并向右下方拖动,以放大图片的尺寸,从而更容易形成图片叠加的效果。 接着来处理另一张图片。 在此处按下并向右下方拖动,将图片移到上面图片的右下方,并和上面的…

chatgpt赋能python:Python如何将两张图片叠加

Python如何将两张图片叠加 介绍 图像处理是计算机视觉领域的重要应用&#xff0c;而Python已经成为了图像处理中最流行的编程语言之一。在图像处理的过程中&#xff0c;有时需要将两张图片叠加在一起&#xff0c;这就需要用到Python中的图像叠加技术。 本文将介绍Python中如…

SQL分表

分表 分表是因为当一张表的数据量比较多时&#xff0c;但是我们只需要查询其中的某个字段数据&#xff0c;就会导致查询效率降低&#xff0c;这时可以将所查询的字段数据存到另一个表里 goods表 创建一个商品分类表 查询goods表中的cate_name并插入到商品分类表里 INSERT I…

java 分表操作_Mybatis Plus 分表操作

大家都知道没到万不已就不分表分库,我也是没有办法,先不使用中间件实现简单的分表操作。可根据实际情况来分表,我现在要分的就是运动穿戴设备的运动数据,单次运动对应多个运动轨迹记录,有运动表(watch_sport)和运动详情表(watch_sport_detail),数据量比较大的就是运动详情…

mysql年月分表_MySQL 按日期分表

一、表不存在时则创建 之前做项目实在是太赶了&#xff0c;很多东西都没记录。是时候补回来了 MySQL做一个大表&#xff0c;由于要存历史记录&#xff0c;所以数据量很大&#xff0c;查询很慢。恰好查询的时候&#xff0c;又不需要时间太久的冷数据。现在将其实现原理提取成一个…

ShardingJdbc分表

ShardingJdbc分表 前言一、ShardingJdbc分表1.引入maven依赖2.yml配置2.分表功能测试 总结 前言 ShardingJdbc官网 下载链接 快速入门 官网原话&#xff1a; Apache ShardingSphere 是一套开源的分布式数据库解决方案组成的生态圈&#xff0c;它由 JDBC、Proxy 和 Sidecar&…

Java如何实现分库分表

一、为啥要分库分表 在大型互联网系统中&#xff0c;大部分都会选择mysql作为业务数据存储。一般来说&#xff0c;mysql单表行数超过500万行或者单表容量超过2GB&#xff0c;查询效率就会随着数据量的增长而下降。这个时候&#xff0c;就需要对表进行拆分。 那么应该怎么拆分…

mysql 垂直分表 设计_水平分表和垂直分表

一、数据库瓶颈 不管是IO瓶颈&#xff0c;还是CPU瓶颈&#xff0c;最终都会导致数据库的活跃连接数增加&#xff0c;进而逼近甚至达到数据库可承载活跃连接数的阈值。在业务Service来看就是&#xff0c;可用数据库连接少甚至无连接可用。接下来就可以想象了吧(并发量、吞吐量、…