矩阵分解(LU分解 特征分解 奇异值分解)

LU分解

LU分解(LU Factorization)是矩阵分解的一种,可以将一个矩阵分解为一个下三角矩阵和一个上三角矩阵的乘积(有时是它们和一个置换矩阵的乘积)。
实际上很简单,以二阶为例,设
A = [ a 11 a 12 a 21 a 22 ] , L = [ 1 0 l 21 1 ] , U =    [ u 11 u 12 0 u 22 ] A=\left[ \begin{matrix} a_{11}& a_{12}\\ a_{21}& a_{22}\\ \end{matrix} \right] , L=\left[ \begin{matrix} 1& 0\\ l_{21}& 1\\ \end{matrix} \right] , U=\,\,\left[ \begin{matrix} u_{11}& u_{12}\\ 0& u_{22}\\ \end{matrix} \right] A=[a11a21a12a22],L=[1l2101],U=[u110u12u22]
由于 A = LU,如下式
[ a 11 a 12 a 21 a 22 ] = [ 1 0 l 21 1 ] [ u 11 u 12 0 u 22 ] = [ u 11 u 12 l 21 u 11 l 21 u 12 + u 22 ] \left[ \begin{matrix} a_{11}& a_{12}\\ a_{21}& a_{22}\\ \end{matrix} \right] =\left[ \begin{matrix} 1& 0\\ l_{21}& 1\\ \end{matrix} \right] \left[ \begin{matrix} u_{11}& u_{12}\\ 0& u_{22}\\ \end{matrix} \right] \\ =\left[ \begin{matrix} u_{11}& u_{12}\\ l_{21}u_{11}& l_{21}u_{12}+u_{22}\\ \end{matrix} \right] [a11a21a12a22]=[1l2101][u110u12u22]=[u11l21u11u12l21u12+u22]
即可求出 L 和 U

# # LU分解
from scipy.linalg import lu
"""
LU分解,矩阵分解的一种,将系数矩阵A转为等价的两个矩阵L、U的乘积,L为单位下三角,U为上三角,是高斯消元法的一种表达式。
在线性代数中已经证明,如果方阵是非奇异的,即的行列式不为0,LU分解总是存在的。
LU分解函数:linalg.lu()
作用:LU分解主要应用在数值分析中,用来解线性方程、求反矩阵或计算行列式。
"""
A = np.arange(1, 17).reshape(4, 4)
p, l, u = lu(a=A, permute_l=False, overwrite_a=False, check_finite=True)
"""
a: 分解矩阵
permute_l:False,执行p*l,返回p、l、u;True,返回pl、u
overwrite_a:是否覆盖a中的数据
check_finite:检查输入矩阵是否具有有限数,有限数可能导致程序崩溃
返回值分析:
permute_l=False时:
p: 置换矩阵(M,M);
l: 具有单位对角线的下三角矩阵(M,K)或梯形矩阵K=min(M,N)
u: 上三角矩阵(K,N)或梯形矩阵
permute_l=True时:
pl: 为(M,K)数组形的置换矩阵K=min(M,N);
u: 上三角矩阵(K,N)或梯形矩阵
"""
print('原矩阵\n', A)
print('p矩阵\n', p)
print('l矩阵\n', l)
print('u矩阵\n', u)
# 原矩阵
#  [[ 1  2  3  4]
#  [ 5  6  7  8]
#  [ 9 10 11 12]
#  [13 14 15 16]]
# p矩阵
#  [[0. 1. 0. 0.]
#  [0. 0. 0. 1.]
#  [0. 0. 1. 0.]
#  [1. 0. 0. 0.]]
# l矩阵
#  [[ 1.          0.          0.          0.        ]
#  [ 0.07692308  1.          0.          0.        ]
#  [ 0.69230769  0.33333333  1.          0.        ]
#  [ 0.38461538  0.66666667 -0.64        1.        ]]
# u矩阵
#  [[ 1.30000000e+01  1.40000000e+01  1.50000000e+01  1.60000000e+01]
#  [ 0.00000000e+00  9.23076923e-01  1.84615385e+00  2.76923077e+00]
#  [ 0.00000000e+00  0.00000000e+00 -2.84672570e-16 -5.75038592e-16]
#  [ 0.00000000e+00  0.00000000e+00  0.00000000e+00  5.32907052e-17]]

特征分解

链接: 特征值和特征向量
A x    =    λ x ( A − λ I ) x = 0 det ⁡ ( A − λ I ) = 0 Ax\,\,=\,\,\lambda x \\ \left( A-\lambda I \right) x=0 \\ \det \left( A-\lambda I \right) =0 Ax=λx(AλI)x=0det(AλI)=0
即可计算出 λ \lambda λ 的取值。再根据 λ \lambda λ 计算出特征向量。
Q = [ x 1 , x 2 , . . . , x n ] Λ = [ λ 1 λ 2 ⋱ λ n ] A Q = Q Λ A = Q Λ Q − 1 Q=\left[ x_1,x_2,...,x_n \right] \\ \varLambda =\left[ \begin{matrix}{} \lambda _1& & & \\ & \lambda _2& & \\ & & \ddots& \\ & & & \lambda _n\\ \end{matrix} \right] \\ AQ=Q\varLambda \\ A=Q\varLambda Q^{-1} Q=[x1,x2,...,xn]Λ= λ1λ2λn AQ=QΛA=QΛQ1
有上式即可特征分解。

奇异值分解

分解成如下所示,其中 nxn 的 U 和 mxm 的 V 为正交矩阵, Σ \varSigma Σ 为 nxm 维的对角矩阵。
A = U Σ V T A=U \varSigma V^T A=UΣVT

A A T = U Σ V T ( U Σ V T ) T = U Σ n × n 2 U T AA^T=U\varSigma V^T\left( U\varSigma V^T \right) ^T=U\varSigma _{n\times n}^{2}U^T AAT=UΣVT(UΣVT)T=UΣn×n2UT
Σ n × n 2 \varSigma _{n\times n}^{2} Σn×n2 是个对角矩阵,把对角矩阵的元素都看作特征值,可以进行特征分解。

同理,再利用 A T A \\A^TA ATA
可以求出 U,V, Σ \varSigma Σ

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
奇异值分解(Singular Value Decomposition,SVD)是一种矩阵分解的方法,在机器学习的一些算法中占有重要地位。在Python中,可以使用numpy包的linalg.svd()函数来进行奇异值分解。例如,可以使用以下代码进行奇异值分解: ```python import numpy as np A = np.array(\[\[2, 4\], \[1, 3\], \[0, 0\], \[0, 0\]\]) u, s, v = np.linalg.svd(A) print(u) print(s) print(v) ``` 其中,`A`是待分解矩阵,`u`是左奇异向量矩阵,`s`是奇异值向量,`v`是右奇异向量矩阵。\[1\] 另外,也可以自定义一个函数来实现奇异值分解,如下所示: ```python import numpy as np def svd(M): u, s, v = np.linalg.svd(M) return u, s, v A = np.array(\[\[2, 4\], \[1, 3\], \[0, 0\], \[0, 0\]\]) u, s, v = svd(A) print(u) print(s) print(v) ``` 这个函数接受一个numpy矩阵`M`作为输入,并返回奇异值分解的结果。\[2\] 需要注意的是,奇异值分解是一种常用的矩阵分解方法,但在实际应用中可能会有其他的矩阵分解方法,如特征分解LU分解、QR分解和极分解等。这些方法在不同的场景下有不同的应用。\[3\] #### 引用[.reference_title] - *1* *3* [奇异值分解 SVD 的数学解释](https://blog.csdn.net/fan_fan_feng/article/details/79668052)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [【SVD(奇异值分解)】详解及python-Numpy实现](https://blog.csdn.net/weixin_43821215/article/details/126003959)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值