矩阵SVD分解
对称矩阵
借助对称矩阵可以处理任何矩阵,将任何矩阵都分解成希望的形式。
概念
对称矩阵中所有元素沿主对角线对称,主对角线元素不要求实相同的。用数学语言表述为 A = A T A=A^T A=AT。对称矩阵也一定是方阵。
对称矩阵性质
- 对称矩阵的特征值一定是实数
- 对称矩阵出现多重特征值时,其几何重数一定等于代数重数。也就意味着对称矩阵一定有 n n n个线性无关的特征向量。
- 对称矩阵一定可以被对角化。这实际上与上一条性质等价。
在之前的笔记中,特征值和特征向量的计算过程涉及到几何重数是否等于代数重数、 n n n个特征向量是否线性无关等判断。而在面对对称矩阵时,这些运算都可以免去。也就是说,对称矩阵减去了先前特征值计算过程中的各类复杂情况。
正交对角化
对称矩阵一定可以被正交对角化
正交对角化是对称矩阵另一个良好的性质,对称矩阵的所有的不同的特征值对应的特征向量相互垂直。
对上面的性质进行证明,
对于对称矩阵具有多重特征值的情况,因为对称矩阵几何重数等于代数重数,
k
k
k重相同特征值的特征空间也是
k
k
k维,所以在这个空间中找到
k
k
k个正交基是没有问题的。
也就是说对称矩阵一定可以被正交对角化。
其中 Q Q Q是标准正交矩阵, Q Q Q矩阵也同样具有良好的性质, Q − 1 = Q T Q^{-1}=Q^T Q−1=QT,所以对称矩阵一定满足 A = Q D Q T A= QDQ^T A=QDQT,这也称为对矩阵 A A A进行了正交对角化。实际上就是在保证了对角化的基础上,同时满足矩阵 P P P是一个标准正交矩阵。
如果一个矩阵能够被正交对角化,则它一定是对称矩阵
对该性质进行证明,
谱定理
实际上就是上面的两个互为充要的条件,因为在有些地方矩阵的特征值或奇异值称为谱。
奇异值
之前讨论的特征值、特征向量、相似型、对角化、对称矩阵和正交对角化的内容都是针对方阵而言的。但是在实际工作中,大部分的数据都是非方阵的。若 A A A是一个 m × n m×n m×n的矩阵,则 A T A A^TA ATA是一个 n × n n×n n×n的方阵,且该方阵是对称矩阵。
对上面的结论进行证明,
由此,所有的对阵矩阵的良好性质都能够应用。即
A
T
A
A^TA
ATA可以被正交对角化,拥有
n
n
n个实数特征值,且相应的特征向量线性无关。
概念
基于上面得证的
A
T
A
A^TA
ATA的性质,进行下面的一步操作,目前先不考虑这样操作的原因,具体原因会在后面说明,
这就将
A
A
A和
A
T
A
A^TA
ATA的特征值和特征向量之间建立联系,因为
∣
∣
A
v
i
⃗
∣
∣
2
||A\vec{v_i}||^2
∣∣Avi∣∣2是模的平方,所以
A
T
A
A^TA
ATA的特征值一定是
≥
0
≥0
≥0的,
奇异值(singular value), σ i = λ i \sigma_i=\sqrt{\lambda_i} σi=λi,就是 A v i ⃗ A\vec{v_i} Avi 对应的向量的长度。
一般情况下,计算得到的奇异值按照从大到小的顺序进行排序。
奇异值几何意义
{ A v i ⃗ } \{A\vec{v_i}\} {Avi}是 A A A的列空间的一组正交基,同时满足特征向量 v i ⃗ \vec{v_i} vi对应的特征值 λ i ≠ 0 λ_i ≠ 0 λi̸=0。对这一结论进行证明分成两部分,
- 证明
A
v
i
⃗
A\vec{v_i}
Avi之间的正交性
- 证明
A
v
i
⃗
A\vec{v_i}
Avi构成
A
A
A的列空间的正交基
当 λ i λ_i λi等于0时, A v i ⃗ A\vec{v_i} Avi对应的向量就是一个零向量,相应的奇异值也为0。如果矩阵 A A A有 r r r个不为0的奇异值,则 { A v 1 ⃗ , A v 2 ⃗ , … … , A v r ⃗ } \{ A\vec{v_1}, A\vec{v_2}, ……, A\vec{v_r} \} {Av1,Av2,……,Avr}是矩阵 A A A的列空间的一组正交基。 A A A的列空间的维度为 r r r,即 A A A矩阵的秩 r a n k ( A ) = r rank(A)=r rank(A)=r。 { A v 1 ⃗ σ 1 , A v 2 ⃗ σ 2 , … … , A v r ⃗ σ r } \{ \frac{A\vec{v_1}}{σ_1}, \frac{A\vec{v_2}}{σ_2}, ……, \frac{A\vec{v_r}}{σ_r} \} {σ1Av1,σ2Av2,……,σrAvr}是矩阵 A A A的列空间的一组标准正交基。
矩阵SVD分解
这是矩阵最重要的分解形式。SVD分解的全称为“Singular Value Decomposition”,即通过矩阵的奇异值进行分解。SVD分解的优势在于,该方法对矩阵没有任何限制,对于任意形状的矩阵都适用。
SVD分解
SVD分解将矩阵分为三部分
矩阵U和V都是标准正交矩阵。
唯一不是方阵的
∑
∑
∑ 比较特殊,
证明SVD分解成立
结合SVD分解的公式,因为U和V都是标准正交矩阵,依据标准正交矩阵的性质
V
T
=
V
−
1
V^T = V^{-1}
VT=V−1。
SVD分解过程
对于一个 m × n m×n m×n的矩阵 A A A,进行SVD分解的步骤如下,
- 求解对称矩阵 A T A A^TA ATA 的特征值和特征向量
- 用所有非零的特征值得到所有非零的奇异值 m × n m×n m×n 的 ∑ ∑ ∑, ∑ ∑ ∑中对角线上的奇异值按照从大到小的顺序进行排列
- 将所有特征向量标准化后得到 n × n n×n n×n的矩阵 V V V
- 使用 A T A A^TA ATA这个矩阵所有 r r r个不为0的特征值及其对应的 r r r个非零特征向量求取 U U U矩阵的列向量 u i ⃗ \vec{u_i} ui,其中 u i ⃗ = A v i ⃗ σ i \vec{ui}=\frac{A\vec{v_i}}{σ_i} ui=σiAvi。如果 r < m r<m r<m,则使用Gram-Schmidt方法对 u i ⃗ \vec{u_i} ui进行扩充,最终得到 m m m维空间的一组正交基。
实现矩阵SVD分解
使用Scipy模块实现SVD分解,
import numpy as np
from scipy.linalg import svd
if __name__ == "__main__":
A = np.array([[1, 2],
[3, 4],
[5, 6]])
U, s, VT = svd(A)
print(U) # 3×3的矩阵
print(s) # 返回一个一维向量,其中每个元素都是矩阵A^(T)A的奇异值
print(VT) # 2×2的矩阵
# 先创建 ∑ 矩阵
Sigma = np.zeros(A.shape)
for i in range(len(s)):
Sigma[i][i] = s[i]
print(U.dot(Sigma).dot(VT)) # 与A矩阵相同
SVD分解的用途
SVD分解使用很广泛,几乎在使用线性代数的地方都脱离不开SVD分解。举例说明,
- 将矩阵
A
A
A看做变换
将 U U U和 V V V看做是 m m m维和 n n n维空间的标准正交基。若向量 x ⃗ \vec{x} x是 V V V矩阵所在空间的向量,则向量 x ⃗ \vec{x} x可以被矩阵 V V V中的列向量表示。
对上面最后一行式子进行说明, A A A矩阵的变换被放在 U U U这个坐标系下看,与此同时变换结果的值是在之前 U U U坐标系中的值的基础上拉伸奇异值倍。 - 将奇异值视为权值
对上式进行整理可以得到,
所以SVD可以对原始数据进行压缩、降维、去噪(奇异值很小的数据可以视为噪音)。上式表示将 A A A这个 m × n m×n m×n的数据,看做是一个 r r r维的数据,其中( r < = m i n ( m , n ) r <= min(m, n) r<=min(m,n))。
SVD在图像领域的应用很广泛,利用SVD分解,减少了一定的数据量但是依旧可以很好的表达图像的语义。