文章目录

  • 计算方法
  • 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. Docker 集群 图形化显示 Visualizer
  2. pandas按条件过滤_pandas条件组合筛选和按范围筛选的示例代码
  3. 科技管理第一课 导论 课程笔记
  4. 使用Nginx代理和转发Websocket连接
  5. java在进行修改时报400_java开发注册群组报错400
  6. 模拟微信自动化发送(微信公众号文章自动点击)
  7. php 冒泡排序数组,php一维二维数组键之冒泡排序
  8. 掉电有点快!iOS15.4翻车:iPhone11/12/13更新后续航直接崩了
  9. BS4 find_all
  10. Makefile 中all:的作用
  11. 5W1H/SWOT/SMART/PDCA/时间管理
  12. Chrome谷歌离线小恐龙更新了!奥运会版本来了!
  13. python 构建和解析邮件
  14. nyoj 54-小明的存钱计划
  15. Annoying day
  16. Python微信操控itchat定时发送消息
  17. 认识PV、UV、UV价值
  18. 数据分析 —— 数据挖掘是什么、能干嘛、怎么做
  19. 【最全】Google Chrome20-83各版本下载链接整理
  20. VS 未能加载文件或程序集“xxx.dll” 原因分析

热门文章

  1. Boosting方法详解
  2. 自动化测试到底怎么做(单元测试自动化,接口自动化,UI自动化)
  3. Smartbanner: Intelligent banner design framework that strikes a balance between freedom and rules
  4. 接口请求报错 504 Gateway Time-out
  5. 高大上的调音台,一秒变成调音师!
  6. python 爬虫模拟点击_爬虫——模拟点击动态页面
  7. 内部总线、系统总线、外部总线区别
  8. 基于无线通讯病房远程通信呼叫和温度检测系统设计
  9. android 心跳包的分析
  10. 一人批量管理多个微信群,有什么好用的社群管理工具?