机器学习中的线性代数:奇异值分解 SVD

发布于:2025-03-07 ⋅ 阅读:(23) ⋅ 点赞:(0)

线性代数 奇异值分解(SVD)

参考资料:
超详细!彻底搞懂矩阵奇异值分解(SVD)本质+计算+应用!_哔哩哔哩_bilibili
非常好的视频,本文内容主要来自于该视频,在此表示感谢!

简单的实对称矩阵

我们从一个简单的对称矩阵开始说起:
A = [ 1 2 2 1 ] A = \left[ \begin{matrix} 1 & 2 \\ 2 & 1 \\ \end{matrix} \right] A=[1221]
我们有 A A A 这样的一个矩阵,一个二维向量 x x x 右乘 A A A 相当于进行了一次线性变换,但是这样并不简洁,从直观的角度上来说,既发生了旋转,也发生了拉伸,比如说 x 1 = ( 1 0 ) x_1 = \left( \begin{matrix}1\\0\end{matrix} \right ) x1=(10),就会得到 A x 1 = ( 1 2 ) Ax_1 = \left( \begin{matrix}1 \\ 2\end{matrix}\right) Ax1=(12),这里显然发生了“拉伸”,也发生了“旋转”,毕竟单一维度的向量已经到达了更高维度的情况。

在这样的思路下,我们尝试抽取一般性的“伸缩矩阵”和“旋转变换矩阵”

  • 伸缩变换(也就是只会沿着某个坐标轴的方向进行倍数变化):
    S = [ λ 1 λ 2 ] = d i a g { λ 1 , λ 2 } S = S T ,        λ 1 , λ 2 ≥ 0 S = \left[ \begin{matrix} \lambda_1 & &\\& & \lambda_2 \end{matrix} \right ] = {diag} \{ \lambda_1, \lambda_2\} \newline S = S^T, \;\;\;\lambda_1, \lambda_2 \ge 0 S=[λ1λ2]=diag{λ1,λ2}S=ST,λ1,λ20
    其中,经过简单验证,可以发现矩阵 S S S 可以保证只会坐标轴方向进行伸缩,其他情况同理

  • 旋转变换:对应到正交矩阵 Q Q Q
    Q T Q = Q Q T = E ,      Q − 1 = Q T Q^T Q=Q Q^T = E, \;\; Q^{-1} = Q^T QTQ=QQT=E,Q1=QT
    正交矩阵对应的就是不改变长度的情况下,向量的旋转变换

从 实对称矩阵 到 分解后的变换

对于 A A A 来说,旋转 -> 伸缩 -> 再旋转是一种比较自然的想法,
A = Q S Q T →    S = Q T A Q = Q − 1 A Q A = QSQ^T \rightarrow \; S = Q^T A Q = Q^{-1} A Q A=QSQTS=QTAQ=Q1AQ
我们先进行某种角度的旋转,待到伸缩变换之后,我们再进行反角度的旋转;
这里 S S S 是对角矩阵,且 Q T = Q − 1 Q^T = Q^{-1} QT=Q1所以 S S S A A A 一定是相似矩阵,这里我们求 S S S ,只需要求出特征值就可以;

但是这里需要注意的是:
我们要求: λ i ≥ 0 \lambda_i \ge 0 λi0 成立,代表的含义是某个维度上的放缩不可以进行反向放缩
但是 Q Q Q 还有其他要求,需要进行“矫正”操作,带后面会继续进行说明

为了使得 S S S 尽量具有唯一性和好的性质,我们常常将 S = d i a g { λ 1 ,    . . . ,    λ n } S=diag\{ \lambda_1, \;... ,\; \lambda_n\} S=diag{λ1,...,λn} 从大到小排列 这样尽量保证唯一性,并且在低秩近似矩阵中也有一定的应用

普通方阵的奇异值分解

对一个普通的方阵 A A A ,我们可以知道 A A T AA^T AAT 以及 A T A A^TA ATA 一定是对称矩阵,证明也很显然:
( A A T ) T = ( A T ) T ( A ) T = A A T (AA^T)^T = (A^T)^T (A)^T = AA^T (AAT)T=(AT)T(A)T=AAT
我们假设 A A A 是可以进行某种类型的分解的(这一点在这里没有证明):
A = P S Q T , P P T = P T P = E , Q Q T = Q T Q = E (1.1) A = P S Q^T, \qquad PP^T=P^TP=E, QQ^T=Q^TQ=E \tag{1.1} A=PSQT,PPT=PTP=E,QQT=QTQ=E(1.1)

A A T = P S Q T Q S T P = P S 2 P T A T A = Q S T P T P S Q T = Q S 2 Q T (1.2) AA^T = PSQ^T Q S^T P = P S^2 P^T \newline A^T A = Q S^T P^T P S Q^T = QS^2Q^T \tag {1.2} AAT=PSQTQSTP=PS2PTATA=QSTPTPSQT=QS2QT(1.2)

注意:尽管我们可以从 ( 1.1 ) (1.1) (1.1) 推导到 ( 1.2 ) (1.2) (1.2),但是二者并不是充要条件,也就是说 这里的 A T A = ( − Q ) S 2 ( − Q ) T A^TA = (-Q) S^2 (-Q)^T ATA=(Q)S2(Q)T 也是有可能出现的,因此,我们通过 ( 1.2 ) (1.2) (1.2) 求出来的特征值可以保证是正确的(直接开根号、取正数),但是特征向量还是需要进行 校正

具体来说,我们需要 ( 1.1 ) (1.1) (1.1) 的完全等价表示:
A = P S Q T ⇔ A Q = P S (1.3) A = PSQ^T \quad \Leftrightarrow \quad AQ = PS \tag{1.3} A=PSQTAQ=PS(1.3)
我们接下来,我们就可以用 ( 1.3 ) (1.3) (1.3) 进行校正,我们可以固定其中的 Q Q Q,默认它是正确的,然后重新解出来 P P P,此时也就可以保证正确性

从 方阵 到 m ∗ n m*n mn 矩阵

A m ∗ n = P m ∗ m    S m ∗ n    Q n ∗ n T (1.4) A_{m*n} = P_{m*m} \; S_{m*n} \; Q_{n*n}^T \tag{1.4} Amn=PmmSmnQnnT(1.4)

这里, P , Q P,Q P,Q 均为正交矩阵,这里假设 m < n m\lt n m<n S S S 需要满足这样的性质: S m ∗ n = ( J m ∗ m   ,    O ) S_{m*n} = (J_{m*m}\,,\;O) Smn=(Jmm,O) J J J 是对角矩阵;

这里可以思考这样一个问题:
如果说, J m ∗ m J_{m*m} Jmm 表示的是各个维度上的伸缩,那么 J m ∗ n J_{m*n} Jmn 表示了怎样的几何含义?

这里只对 A m ∗ n , m < n A_{m*n}, m \lt n Amn,m<n 的情况进行讨论,另一边可以用相似的方法:
A m ∗ n = P S Q T = P   ( J , O )   Q T A A T = P S S T P T = P J 2 P T A T A = Q S T S Q T = Q ( J O ) ( J O ) Q T = Q ( J 2 O O O ) Q T A_{m*n} = PSQ^T = P\,(J, O) \,Q^T \newline AA^T = PSS^TP^T = PJ^2P^T \newline A^TA = QS^TSQ^T = Q \left( \begin{matrix} J \\ O \end{matrix} \right) \left( \begin{matrix} J & O \end{matrix} \right)Q^T = Q \left( \begin{matrix}J^2 & O \\ O & O \end{matrix} \right)Q^T Amn=PSQT=P(J,O)QTAAT=PSSTPT=PJ2PTATA=QSTSQT=Q(JO)(JO)QT=Q(J2OOO)QT
这样求出公共的特征值,仍然需要进行校正操作,就可以得到最终答案

奇异值分解的实际应用

奇异值分解被广泛用于图像处理、低秩近似矩阵等领域,可以用来进行数据压缩等等;
比如说,一张 512 * 512 的图片,我们正常来说需要记录它的全部像素点,但是 A = P S Q T A = PSQ^T A=PSQT,而且我们可以逐个 S S S 的元素进行展开,
A = [ α 1 . . . α n ] d i a g { λ 1 , . . . , λ n } [ β 1 . . . β n ] T A = \left[ \begin{matrix} \alpha_1& ... &\alpha_n \end{matrix} \right] diag\{\lambda_1, ... ,\lambda_n \} \left[ \begin{matrix} \beta_1& ... &\beta_n \end{matrix} \right]^T A=[α1...αn]diag{λ1,...,λn}[β1...βn]T
这样我们可以发现,每一项一定是秩为1的,而且如果按照我们所说的 λ i \lambda_i λi 大的部分放的更靠前,那么我们就在一定程度上认为,前面的部分所占的权重更大,可能只取前面 200 项的时候,就基本能够近似表示原本的图片,这也就是所谓“低秩近似”,也就起到了压缩图片的作用