1061 字
5 分钟
[人工智能数学基础] 矩阵分解

工程上通常会用矩阵分解来求解线性方程组

LU分解#

将矩阵分解为一个下三角矩阵和一个上三角矩阵的乘积:

A=LUA = LU

其中LL是下三角矩阵,UU是上三角矩阵

  • 下三角矩阵:所有元素在主对角线以下的矩阵,主对角线元素可以是任意值
  • 上三角矩阵:所有元素在主对角线以上的矩阵,主对角线元素可以是任意值

LU手算方法#

  1. 将矩阵AA进行高斯消元,得到一个上三角矩阵UU,消元时RikRjR_i - k R_j(第ii行减去第jj行的kk倍)的系数kk就是下三角矩阵LL中元素lijl_{ij}的值

e.g.:

A=[2347]U=[2301]L=[1021]A = \begin{bmatrix} 2 & 3 \\ 4 & 7 \end{bmatrix} \quad \rightarrow \quad U = \begin{bmatrix} 2 & 3 \\ 0 & 1 \end{bmatrix} \quad \rightarrow \quad L = \begin{bmatrix} 1 & 0 \\ 2 & 1 \end{bmatrix}
NOTE

定型文:直接解Ax=bAx = b和先LU分解再解方程,复杂度都是O(n3)O(n^3),为什么还要分解?

  1. LU分解可以复用:如果要解多个方程Ax=biAx = b_i,只需要一次LU分解,后续每个方程的求解复杂度是O(n2)O(n^2),比直接解每个方程的O(n3)O(n^3)更高效
  2. 空间复杂度低:LU分解为”原地”操作,可用原A的空间存储L和U
  3. 行列式计算简单:det(A)=det(L)det(U)\det(A) = \det(L) \cdot \det(U),其中det(L)=1\det(L) = 1,所以det(A)=i=1nuii\det(A) = \prod_{i=1}^n u_{ii},只需要计算上三角矩阵UU的对角线元素的乘积即可
  4. 数值稳定性:LU分解可以通过部分选主元来提高数值稳定性,避免除以小数导致的误差放大
  5. 求逆更快

QR分解#

将矩阵分解为一个正交矩阵和一个上三角矩阵的乘积:

A=QRA = QR

其中QQ是正交矩阵,RR是上三角矩阵

QR手算方法#

  1. 使用格拉姆-施密特正交化方法将矩阵AA的列向量正交化,得到一个正交矩阵QQ,正交化过程中每个列向量的长度就是上三角矩阵RR中的元素

e.g.:

A=[3142]A=[a1,a2]Q=[q1,q2]A = \begin{bmatrix} 3 & 1 \\ 4 & 2 \end{bmatrix} \\[1em] A = \left [ \mathbf{a_1}, \mathbf{a_2} \right ] \\ Q = \left [ \mathbf{q_1}, \mathbf{q_2} \right ]

先算q1\mathbf{q_1}

q1=a1a1=15[34]\mathbf{q_1} = \frac{\mathbf{a_1}}{\Vert \mathbf{a_1}\Vert} = \frac{1}{5} \begin{bmatrix} 3 \\ 4 \end{bmatrix}

然后算a2\mathbf{a_2}q1\mathbf{q_1}上的投影:

projq1a2=(a2q1q1q1)q1=1125[34]\text{proj}_{\mathbf{q_1}} \mathbf{a_2} = \left( \frac{\mathbf{a_2} \cdot \mathbf{q_1}}{\mathbf{q_1} \cdot \mathbf{q_1}} \right) \mathbf{q_1} = \frac{11}{25} \begin{bmatrix} 3 \\ 4 \end{bmatrix}

得垂直向量v2\mathbf{v_2}

v2=a2projq1a2=[12]1125[34]=125[86]\mathbf{v_2} = \mathbf{a_2} - \text{proj}_{\mathbf{q_1}} \mathbf{a_2} = \begin{bmatrix} 1 \\ 2 \end{bmatrix} - \frac{11}{25} \begin{bmatrix} 3 \\ 4 \end{bmatrix} = \frac{1}{25} \begin{bmatrix} -8 \\ 6 \end{bmatrix}

最后算q2\mathbf{q_2}

q2=v2v2=110[86]\mathbf{q_2} = \frac{\mathbf{v_2}}{\Vert \mathbf{v_2} \Vert} = \frac{1}{10} \begin{bmatrix} -8 \\ 6 \end{bmatrix}

得到:

Q=15[3443]R=QTA=[a1projq1a20v2]=[52.200.4]Q = \frac{1}{5} \begin{bmatrix} 3 & -4 \\ 4 & 3 \end{bmatrix} \quad \rightarrow \quad R = Q^T A = \begin{bmatrix} \Vert \mathbf{a_1} \Vert & \Vert \mathbf{\text{proj}_{\mathbf{q_1}} \mathbf{a_2}} \Vert \\ 0 & \Vert \mathbf{v_2} \Vert \end{bmatrix} = \begin{bmatrix} 5 & 2.2 \\ 0 & 0.4 \end{bmatrix}

奇异值分解(SVD)#

A=UΣVTA = U \Sigma V^T

其中UU是左奇异矩阵,Σ\Sigma是对角矩阵,VTV^T是右奇异矩阵的转置

SVD手算#

这你要考手算那我还说啥了,分不要了呗

特征值分解(EVD)#

A=PDP1A = PDP^{-1}

其中PP是特征向量矩阵,DD是特征值对角矩阵

EVD手算#

  1. 计算矩阵AA的特征值λ\lambda,通过求解特征多项式det(AλI)=0\det(A - \lambda I) = 0得到
  2. 对于每个特征值λ\lambda,求解特征向量v\mathbf{v},通过求解线性方程组(AλI)v=0(A - \lambda I)\mathbf{v} = 0得到
  3. 把特征值摆在DD的对角线上,把对应的特征向量摆在PP的列向量上
  4. 还要求P1P^{-1},如果是对称矩阵,特征向量相互正交,PP是正交矩阵,P1=PTP^{-1} = P^T,否则需要通过其他方法求逆

Cholesky(科列斯基)分解#

A=LLTA = LL^T

其中LL是下三角矩阵

Cholesky手算#

LU分解升级版

  1. 对角线元素:lii=aiik=1i1lik2l_{ii} = \sqrt{a_{ii} - \sum_{k=1}^{i-1} l_{ik}^2}
  2. 非对角线元素:lij=1ljj(aijk=1j1likljk)l_{ij} = \frac{1}{l_{jj}} \left( a_{ij} - \sum_{k=1}^{j-1} l_{ik} l_{jk} \right),其中i>ji > j

e.g.:

A=[a11a12a13a21a22a23a31a32a33]L=[l1100l21l220l31l32l33]A = \begin{bmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{bmatrix} L = \begin{bmatrix} l_{11} & 0 & 0 \\ l_{21} & l_{22} & 0 \\ l_{31} & l_{32} & l_{33} \end{bmatrix}

先算第一列:

l11=a11l21=a21l11l31=a31l11l_{11} = \sqrt{a_{11}} \\[1em] l_{21} = \frac{a_{21}}{l_{11}} \\[1em] l_{31} = \frac{a_{31}}{l_{11}}

然后算第二列:

l22=a22l212l32=1l22(a32l31l21)l_{22} = \sqrt{a_{22} - l_{21}^2} \\[1em] l_{32} = \frac{1}{l_{22}} \left( a_{32} - l_{31} l_{21} \right)

最后算第三列:

l33=a33(l312+l322)l_{33} = \sqrt{a_{33} - (l_{31}^2 + l_{32}^2)}
[人工智能数学基础] 矩阵分解
https://a1kari8.github.io/posts/ai_math/decomp/
作者
A1kari8
发布于
2026-04-19
许可协议
CC BY-NC-SA 4.0