【矩阵论】Chapter 6— 矩阵分解知识点总结复习(附 Python 实现)
矩阵分解
1 满秩分解(Full-Rank Factorization)
满秩分解定理
设 矩阵 的秩为,则存在 矩阵(列满秩矩阵)和 矩阵(行满秩矩阵)使得
并且
满秩分解不唯一
定理:设 为 矩阵,且,存在 阶可逆矩阵 和 阶可逆矩阵,使得
。
证明满秩分解定理:
是可逆矩阵, 的 个列是 的前 列; 的 个行是 的前 行
满秩分解步骤
- 设 为 矩阵,首先求
- 取 的列构成
- 取 的
Hermite
标准型(即行最简行矩阵) 的前 行构成矩阵 - 则 就是矩阵 的一个满秩分解
Python
求解满秩分解1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
import numpy as np from sympy import Matrix ''' Full-Rank Factorization @params: A Matrix @return: F, G Matrix ''' def full_rank(A): r = A.rank() A_arr1 = np.array(A.tolist()) # 求解A的最简行阶梯矩阵,要转换成list,再转换成array A_rref = np.array(A.rref()[0].tolist()) k = [] # 存储被选中的列向量的下标 # 遍历A_rref的行 for i in range(A_rref.shape[0]): # 遍历A_rref的列 for j in range(A_rref.shape[1]): # 遇到1就说明找到了A矩阵的列向量的下标 # 这些下标的列向量组成F矩阵,然后再找下一行 if A_rref[i][j] == 1: k.append(j) break # 通过选中的列下标,构建F矩阵 B = Matrix(A_arr1[:,k]) # G就是取行最简行矩阵A的前r行构成的矩阵 C = Matrix(A_rref[:r]) return B, C if __name__ == "__main__": # 表示矩阵A A = np.array([[1, 1, 0], [0, 1, 1], [-1, 0, 0], [1, 1, 1]]) A = Matrix(A) B, C = full_rank(A) print("B:", B) print("C:", C)
2 三角分解(Triangular Factorization)
分解定义
如果有一个矩阵,我们能表示下三角矩阵 和上三角矩阵 的乘积,称为 的三角分解或 分解。
更进一步,我们希望下三角矩阵的对角元素都为
分解定理
若 是 阶非奇异矩阵,则存在唯一的单位下三角矩阵 和上三角矩阵 使得 的充分必要条件是 的所有顺序主子式均非零(这一条件保证了对角线元素非零),即
分解步骤
设 为 矩阵
- 进行初等行变换(注意:不涉及行交换的初等变换),从第 行开始,到第 行结束。将第 行第 列以下的元素全部消为
- 这样操作后得到的矩阵即为
- 构造对角线元素全为 的单位下三角矩阵, 的剩余元素通过构建方程组的形式来求解。
Python
求解 分解分解的实际意义
解线性方程组
假设我们有一个线性方程组,其中 是一个非奇异矩阵,而 是一个列向量。通过 分解,我们可以将方程组转化为两个简化的方程组 和,其中 是下三角矩阵, 是上三角矩阵。这两个方程组分别易于求解。
具体:
首先,通过前代法(forward substitution)解,然后通过回代法(backward substitution)解。这样,我们就得到了方程组的解。
分解定理
设 是 阶非奇异矩阵,则存在唯一的单位下三角矩阵,对角矩阵 和上三角矩阵 使得 的充分必要条件是 的所有顺序主子式均非零(这一条件保证了对角线元素非零),即 并且
分解步骤
设 为 矩阵
- 先求 分解
- 将 的对角线元素提出来构成对角矩阵
- 中的元素除以,其中表示第 个对角元素。这样操作得到变换后的
Python
求解 分解1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
import numpy as np from sympy import Matrix import pprint EPSILON = 1e-8 def is_zero(x): return abs(x) < EPSILON def LU(A): # 断言A必须是非奇异方阵A assert A.rows == A.cols, "Matrix A must be a square matrix" assert A.det() != 0, "Matrix A must be a nonsingular matrix" n = A.rows U = A # 构建出U矩阵 # 将U转换成list,再转换成array U = np.array(U.tolist()) # 遍历U的每一行利用高斯消元法 for i in range(n): # 判断U[i][i]是否为0 assert not is_zero(U[i][i]), "主元为0,无法进行LU分解" # 对i+1行到n行进行消元 for j in range(i + 1, n): # 计算消元因子 factor = U[j][i] / U[i][i] # 对第j行进行消元 for k in range(i, n): U[j][k] -= factor * U[i][k] # 消元后的矩阵U则是最终U矩阵 U = Matrix(U) # 根据LU = A,得到L矩阵 L = A * U.inv() return L, U def LDU(A): L, U = LU(A) D = Matrix(np.diag(np.diag(U))) U = D.inv() * U return L, D, U if __name__ == '__main__': A = np.array([[2, 3, 4], [1, 1, 9], [1, 2, -6]]) A = Matrix(A) ''' # test LU分解 L, U = LU(A) pprint.pprint("L:") pprint.pprint(L) pprint.pprint("U:") pprint.pprint(U) ''' # test LDU分解 L, D, U = LDU(A) pprint.pprint("L:") pprint.pprint(L) pprint.pprint("D:") pprint.pprint(D) pprint.pprint("U:") pprint.pprint(U)
分解
PLU 分解是将矩阵 分解成一个置换矩阵、单位下三角矩阵 和上三角矩阵 的乘积,即
之前 分解中限制了行交换,如果不可避免的必须进行行互换,我们就需要进行 分解。
实际上只需要把 变成 就可以了,实际上所有的 都可以写成 的形式,由于左乘置换矩阵 是在交换行的顺序,所以由 推得适当的交换 的行的顺序,即可将 做 分解。当 没有行互换时, 就是单位矩阵。
事实上,所有的方阵都可以写成 分解的形式,事实上, 分解有很高的数值稳定性,因此实用上是很好用的工具。
3 正交三角分解(QR Factorization)
分解定理
分解步骤
设 为 矩阵,即。则:
Python
求解 分解常规计算:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
import numpy as np import sympy from sympy import Matrix from sympy import * import pprint #正交三角分解(QR) a = [[1, 1, -1], [-1, 1, 1], [1, 1, -1], [1, 1, 1]] # a = [[1,1,-1], # [1,0,0], # [0,1,0], # [0,0,1]] A_mat = Matrix(a)#α向量组成的矩阵A # A_gs= GramSchmidt(A_mat) A_arr = np.array(A_mat) L = [] for i in range(A_mat.shape[1]): L.append(A_mat[:,i]) #求Q A_gs = GramSchmidt(L)#α的施密特正交化得到β A_gs_norm = GramSchmidt(L,True)#β的单位化得到v A = [] for i in range(A_mat.shape[1]): for j in range(A_mat.shape[0]): A.append(A_gs_norm[i][j])#把数排成一行 A_arr = np.array(A) A_arr = A_arr.reshape((A_mat.shape[0],A_mat.shape[1]),order = 'F')#用reshape重新排列(‘F’为竖着写) #得到最后的Q Q = Matrix(A_arr) #求R C = [] for i in range(A_mat.shape[1]): for j in range(A_mat.shape[1]): if i > j: C.append(0) elif i == j: t = np.array(A_gs[i]) m = np.dot(t.T,t) C.append(sympy.sqrt(m[0][0])) else: t = np.array(A_mat[:,j]) x = np.array(A_gs_norm[i]) n = np.dot(t.T,x) # print(n) C.append(n[0][0]) # C_final为R C_arr = np.array(C) # print(C_arr) C_arr = C_arr.reshape((A_mat.shape[1],A_mat.shape[1])) R = Matrix(C_arr) pprint.pprint("Q:") pprint.pprint(Q) pprint.pprint("R:") pprint.pprint(R)
调用库函数
1 2 3 4 5 6 7 8
# 求矩阵A的QR分解,保留根号 Q_, R_ = A_mat.QRdecomposition() pprint.pprint("Q_:") pprint.pprint(Q_) pprint.pprint("R_:") pprint.pprint(R_) assert Q_ == Q, "Q_ != Q" assert R_ == R, "R_ != R"
4 奇异值分解(SVD)
定理
设 是 矩阵,且,则存在 阶酉矩阵 和 阶酉矩阵 使得
其中,且。
为 的奇异值,具体含义这里不在叙述,但需要记住的是 是 的特征值,也是 的特征值,且:
- 与 的特征值均为非负数
- 与 的非零特征值相同,并且非零特征值的个数(重特征值按重数计算)等于
所以我们求 就转换成求这两个矩阵其中一个的特征值。
分解步骤
Python
求解奇异值分解1 2 3 4 5 6 7 8 9 10
import numpy as np from sympy import Matrix import pprint A = np.array([[1,0],[0,1],[1,1]]) # 求A的奇异值分解 U, sigma, VT = np.linalg.svd(A) print ("U:", U) print ("sigma:", sigma) print ("VT:", VT)
相关内容
- 【矩阵论】Chapter 1— 向量空间知识点总结复习
- 【矩阵论】Chapter 2— 内积空间知识点总结复习
- 【矩阵论】Chapter 3— 线性映射和线性变换知识点总结复习
- 【矩阵论】Chapter 4— 特征值和特征向量知识点总结复习
- 【矩阵论】Chapter 5—lambda 矩阵与 Jordan 标准型

