文章目录

  • 计算方法
  • python实现
  • 数据测试

计算方法

  矩阵的正交三角分解QR decomposition,简称QR分解,是找到两个矩阵Q和R使得 A = Q R A=QR A=QR,Q是正交矩阵(就是 Q T Q = E Q^TQ=E QTQ=E的矩阵,也就是列向量之间互相正交的矩阵),R是对角线上没有0的上三角矩阵。
  QR分解主要有三种方法:

  1. 施密特正交化
  2. Householder变换
  3. Givens旋转

  本文只讲施密特正交化Gram-Schmidt orthogonalization,Gram-Schmit正交分解步骤很简单,是先根据原矩阵获取一组正交基,再求原矩阵在这组正交基下的坐标。以 3 × 3 3\times3 3×3矩阵 ( w 1 , w 2 , w 3 ) (w_1,w_2,w_3) (w1​,w2​,w3​)为例子。
u 1 = w 1 u 2 = w 2 − ( u 1 , w 2 ) ( u 1 , u 1 ) u 1 u 3 = w 3 − ( u 1 , w 3 ) ( u 1 , u 1 ) u 1 − ( u 2 , w 3 ) ( u 2 , u 2 ) u 2 u i = w i − ∑ j = 1 j < i ( u j , w i ) ( u j , u j ) u j ( w 1 , w 2 , w 3 ) = ( u 1 , u 2 , u 3 ) ( 1 ( u 1 , w 2 ) ( u 1 , u 1 ) ( u 1 , w 3 ) ( u 1 , u 1 ) 0 1 u 2 ⋅ w 3 ( u 2 , u 2 ) 0 0 1 ) Q = ( u 1 , u 2 , u 3 ) R = ( 1 ( u 1 , w 2 ) ( u 1 , u 1 ) ( u 1 , w 3 ) ( u 1 , u 1 ) 0 1 ( u 2 , w 3 ) ( u 2 , u 2 ) 0 0 1 ) \\ u_1=w_1\\ u_2=w_2-\frac{(u_1, w_2)}{(u_1,u_1)} u_1\\ u_3=w_3-\frac{(u_1, w_3)}{(u_1,u_1)} u_1-\frac{(u_2,w_3)}{(u_2,u_2)} u_2\\ u_i=w_i-\sum_{j=1}^{j<i} \frac{(u_j,w_i)}{(u_j,u_j)} u_j\\ (w_1,w_2 ,w_3)= (u_1, u_2,u_3)\begin{pmatrix} 1& \frac{(u_1, w_2)}{(u_1,u_1)} & \frac{(u_1, w_3)}{(u_1,u_1)} \\ 0 & 1 & \frac{u_2\cdot w_3}{(u_2,u_2)}\\ 0 & 0 & 1 \end{pmatrix}\\ Q= (u_1,u_2,u_3)\\ R=\begin{pmatrix} 1& \frac{(u_1, w_2)}{(u_1,u_1)} & \frac{(u_1, w_3)}{(u_1,u_1)} \\ 0 & 1 & \frac{(u_2,w_3)}{(u_2,u_2)}\\ 0 & 0 & 1 \end{pmatrix} u1​=w1​u2​=w2​−(u1​,u1​)(u1​,w2​)​u1​u3​=w3​−(u1​,u1​)(u1​,w3​)​u1​−(u2​,u2​)(u2​,w3​)​u2​ui​=wi​−j=1∑j<i​(uj​,uj​)(uj​,wi​)​uj​(w1​,w2​,w3​)=(u1​,u2​,u3​) ​100​(u1​,u1​)(u1​,w2​)​10​(u1​,u1​)(u1​,w3​)​(u2​,u2​)u2​⋅w3​​1​ ​Q=(u1​,u2​,u3​)R= ​100​(u1​,u1​)(u1​,w2​)​10​(u1​,u1​)(u1​,w3​)​(u2​,u2​)(u2​,w3​)​1​ ​
  公式里的 u 1 , u 2 , ⋯ , u i u_1,u_2,\cdots,u_i u1​,u2​,⋯,ui​是一组正交基。Gram-Schmit正交分解获得的两个矩阵,右边的是上三角矩阵没错,但一般在上面的步骤做完之后,还需要对得到的Q和R两个矩阵进行单位化。以 3 × 3 3\times3 3×3矩阵为例子,单位化是做如下处理:
Q = ( u 1 ( u 1 , u 1 ) u 2 ( u 2 , u 2 ) u 3 u 3 ⋅ u 3 ) R = ( ( u 1 , u 1 ) ( u 1 , w 2 ) ( u 1 , u 1 ) ( u 1 , w 3 ) ( u 1 , u 1 ) 0 ( u 2 , u 2 ) ( u 2 , w 3 ) ( u 2 , u 2 ) 0 0 u 3 ⋅ u 3 ) Q=\begin{pmatrix} \frac{u_1}{\sqrt{(u_1,u_1)}} &\frac{ u_2}{\sqrt{(u_2,u_2)}} & \frac{u_3}{\sqrt{u_3\cdot u_3}} \end{pmatrix}\\ R=\begin{pmatrix} \sqrt{(u_1,u_1)} & \frac{(u_1, w_2)}{\sqrt{(u_1,u_1)}}& \frac{(u_1, w_3)}{\sqrt{(u_1,u_1)}} \\ 0 & \sqrt{(u_2,u_2)} & \frac{(u_2,w_3)}{\sqrt{(u_2,u_2)}}\\ 0 & 0 & \sqrt{u_3\cdot u_3} \end{pmatrix} Q=((u1​,u1​) ​u1​​​(u2​,u2​) ​u2​​​u3​⋅u3​ ​u3​​​)R= ​(u1​,u1​) ​00​(u1​,u1​) ​(u1​,w2​)​(u2​,u2​) ​0​(u1​,u1​) ​(u1​,w3​)​(u2​,u2​) ​(u2​,w3​)​u3​⋅u3​ ​​ ​
  以下列矩阵为例子:
( 2 1 − 1 1 2 − 1 − 1 − 1 2 ) Q = ( 2 − 0.667 0.364 1 1.167 0.364 − 1 − 0.167 1.091 ) R = ( 1 0.833 − 0.833 0 1 − 0.455 0 0 1 ) \begin{pmatrix} 2& 1& -1\\ 1& 2& -1\\ -1& -1& 2 \end{pmatrix}\\ Q= \begin{pmatrix}2 & -0.667 & 0.364\\ 1 & 1.167 & 0.364\\ -1 & -0.167 & 1.091\\ \end{pmatrix}\\ R= \begin{pmatrix}1 & 0.833 & -0.833\\ 0 & 1 & -0.455\\ 0 & 0 & 1\\ \end{pmatrix} ​21−1​12−1​−1−12​ ​Q= ​21−1​−0.6671.167−0.167​0.3640.3641.091​ ​R= ​100​0.83310​−0.833−0.4551​ ​
  单位化之后,就是下面的结果:
Q = ( 0.816 − 0.492 0.302 0.408 0.862 0.302 − 0.408 − 0.123 0.905 ) R = ( 2.449 2.041 − 2.041 0.0 1.354 − 0.615 0.0 0.0 1.206 ) Q= \begin{pmatrix}0.816 & -0.492 & 0.302\\ 0.408 & 0.862 & 0.302\\ -0.408 & -0.123 & 0.905\\ \end{pmatrix}\\ R= \begin{pmatrix}2.449 & 2.041 & -2.041\\ 0.0 & 1.354 & -0.615\\ 0.0 & 0.0 & 1.206\\ \end{pmatrix} Q= ​0.8160.408−0.408​−0.4920.862−0.123​0.3020.3020.905​ ​R= ​2.4490.00.0​2.0411.3540.0​−2.041−0.6151.206​ ​

python实现

  实现代码就是严格按照公式:

def gram_schmidt(self, matrix = None):# q矩阵先复制原矩阵q = [[i for i in vector] for vector in self.__vectors]# 从第二个向量开始做减法# q的长度数组q_square = [0 for _ in q]q_square[0] = inner_product(q[0], q[0], matrix)q_length = [0 for _ in q]q_length[0] = math.sqrt(q_square[0])columns = len(self.__vectors)# r 初始化为全部为0r = [[0 for _ in vector] for vector in self.__vectors]# r对角线为1for i, vector in enumerate(r):vector[i] = 1# i 是列for i in range(1, columns):q[i] = self.__vectors[i]# sum其实是一个向量for j in range(0, i):frac = inner_product(q[j], self.__vectors[i], matrix) / q_square[j]# 把系数存储在r中r[i][j] = fracq[i] = sub(q[i], mul_num(q[j], frac))q_square[i] = inner_product(q[i], q[i], matrix)q_length[i] = math.sqrt(q_square[i])# Q单位化# R乘回来for i, vector in enumerate(q):for j, e in enumerate(vector):vector[j] = e / q_length[i]# vector[j] = round(vector[j] * 10000) / 10000.0# i 代表向量,也就是列for i, vector in enumerate(r):# j才代表行for j, e in enumerate(vector):# 每一行乘以长度vector[j] = e * q_length[j]# vector[j] = round(vector[j] * 10000) / 10000.0return Matrix(q), Matrix(r)

数据测试

  以下矩阵,在标准内积下分解为:
( 2 1 − 1 1 2 − 1 − 1 − 1 2 ) = ( 0.816 − 0.493 0.303 0.408 0.862 0.301 − 0.408 − 0.123 0.906 ) ( 2.449 2.041 − 2.041 0 1.353 − 0.614 0 0 1.204 ) \begin{pmatrix}2 & 1 & -1\\ 1 & 2 & -1\\ -1 & -1 & 2\\ \end{pmatrix}\\= \begin{pmatrix}0.816 & -0.493 & 0.303\\ 0.408 & 0.862 & 0.301\\ -0.408 & -0.123 & 0.906\\ \end{pmatrix} \begin{pmatrix}2.449 & 2.041 & -2.041\\ 0 & 1.353 & -0.614\\ 0 & 0 & 1.204\\ \end{pmatrix} ​21−1​12−1​−1−12​ ​= ​0.8160.408−0.408​−0.4930.862−0.123​0.3030.3010.906​ ​ ​2.44900​2.0411.3530​−2.041−0.6141.204​ ​
  定义内积为:
( x , y ) = x T ( 1 0 0 0 2 0 0 0 3 ) y (x,y)=x^T\begin{pmatrix}1 & 0 & 0\\ 0 & 2 & 0\\ 0 & 0 & 3\\ \end{pmatrix}y (x,y)=xT ​100​020​003​ ​y
  在这个内积下,QR分解为:
( 2 1 − 1 1 2 − 1 − 1 − 1 2 ) = ( 0.667 − 0.577 0.471 0.333 0.577 0.236 − 0.333 0 0.471 ) ( 3 3 − 3.333 0 1.732 − 0.577 0 0 1.887 ) \begin{pmatrix}2 & 1 & -1\\ 1 & 2 & -1\\ -1 & -1 & 2\\ \end{pmatrix} \\=\begin{pmatrix}0.667 & -0.577 & 0.471\\ 0.333 & 0.577 & 0.236\\ -0.333 & 0 & 0.471\\ \end{pmatrix} \begin{pmatrix}3 & 3 & -3.333\\ 0 & 1.732 & -0.577\\ 0 & 0 & 1.887\\ \end{pmatrix} ​21−1​12−1​−1−12​ ​= ​0.6670.333−0.333​−0.5770.5770​0.4710.2360.471​ ​ ​300​31.7320​−3.333−0.5771.887​ ​

5.5 QR分解一:施密特正交化相关推荐

  1. 施密特正交化c语言,C语言实现矩阵的LU分解、施密特正交化、Givens分解、Householder分解...

    <C语言实现矩阵的LU分解.施密特正交化.Givens分解.Householder分解>由会员分享,可在线阅读,更多相关<C语言实现矩阵的LU分解.施密特正交化.Givens分解.H ...

  2. 【矩阵论笔记】正交分解——满秩Schmidt分解(施密特正交化)

    QR分解 例子 要求可逆,但是是不可逆的时候是不是又QR分解呢?这就是涉及到下一篇讲的household分解

  3. 矩阵论——施密特正交化求行列式QR分解

    矩阵论--施密特正交化&求行列式&QR分解 前言 施密特正交化(Schimidt Orthogonalization ) 代码实现 example 求行列式det 代码实现 examp ...

  4. 施密特正交化及QR分解(附实现代码)

    施密特正交化 施密特正交化(Gram-Schmidt Orthogonality)是常用的求欧式空间正交基的方法.给定一个线性无关向量组a1,a2,...,ama_1,a_2,...,a_ma1​,a ...

  5. 线性代数学习笔记5-3:标准正交基、正交矩阵、施密特正交化、QR分解

    正交矩阵 一组标准正交向量Orthonormal vectors满足: qiTqj={0i≠j1i=j\mathbf{q}_{i}^{T} \mathbf{q}_{j}=\left\{\begin{a ...

  6. ESL3.2(下)最小二乘法学习笔记(含施密特正交化,QR分解)

    3.2(下) 最小二乘法 这是一篇有关<统计学习基础>,原书名The Elements of Statistical Learning的学习笔记,该书学习难度较高,有很棒的学者将其翻译成中 ...

  7. [矩阵的QR分解系列一] 施密特(Schmidt)正交规范化

    施密特正交规范化 简介 规范化步骤 例子 引用 之前介绍的矩阵的三角分解系列介绍了利用矩阵初等变换解决了矩阵三角化问题以及具体的三角分解.但是以初等变换工具的三角分解方法并不能消除病态线性方程组不稳定 ...

  8. 施密特正交化_格拉姆-施密特正交化--QR分解法的来源

    人类的数学发展到了今天,已经如浩瀚的宇宙般深不见底,不管时代怎么变迁,数学总是以超前于人类的科技水平而存在,如果说宇宙有尽头的话,那么宇宙的尽头也是数学的尽头,数学的停止就是世界的末日.所以我后悔当初 ...

  9. LU分解(是/否部分主元法)+ 施密特(Schmidt)QR分解 + 吉文斯(Givens)QR分解 + Household QR分解 代码详解,可直接运行版本复测试用例(java8版)

    1)2)LU分解(是/否部分主元法)+ 3)施密特(Schmidt)QR分解 + 4)吉文斯(Givens)QR分解 + 5)Household QR分解 代码详解 可直接运行版本复测试用例(java ...

最新文章

  1. mysql 魔乐_MLDN 李兴华 魔乐科技网上最全笔记
  2. 解决Linux下启动Tomcat遇到Neither the JAVA_HOME nor the JRE_HOME environment variable is defined...
  3. linux网络编程之二-----多播(组播)编程
  4. 303. Range Sum Query - Immutable
  5. Codeforces-712C-Memory and De-Evolution
  6. C语言试题六十九之请编写函数判断一个数是不是素数
  7. 十、Spring的@Profile注解
  8. 95-140-106-源码-transform-算子filter
  9. javascript HTMLElement
  10. linux 线程和进程优先级,c – 在linux中更改线程优先级和调度程序
  11. 计算机视觉基础——3D空间坐标点的重建(三角测量)
  12. CocosCreator之微信小游戏的聊天/提示气泡制作
  13. 微信小程序计算时间差
  14. idea配置maven并用maven打包
  15. Opensearch架构及引擎原理
  16. 线性代数计算机应用论文,线性代数问题的计算机应用.docx
  17. 什么是信用评级?信用评级你了解多少?
  18. Nextcloud 内部服务器错误 服务器不能完成您的请求 解决办法
  19. html 之一个简单的导航栏
  20. Git 介绍 ppt

热门文章

  1. iframe的常用方法
  2. 2021年后国内互联网发展趋势预测
  3. 35岁到40岁,如何突破
  4. revit建模中两面墙贴在一起怎么插入门窗及隐框玻璃的做法
  5. win系统如何运行msi后缀文件
  6. 退耦电容原理--退藕电容的一般配置原则
  7. OpenStack-M版(Mitaka)搭建基于(Centos7.2)+++十、Openstack对象存储服务(swift)中
  8. python + opencv微博图片去水印
  9. 8.1 Kotlin Sealed类
  10. NumPy transpose 的定义与计算过程