借助对称矩阵可以处理任何矩阵,将任何矩阵都分解成希望的形式。
对称矩阵中所有元素沿主对角线对称,主对角线元素不要求实相同的。用数学语言表述为 A = A T A=A^T A=AT。对称矩阵也一定是方阵。
在之前的笔记中,特征值和特征向量的计算过程涉及到几何重数是否等于代数重数、 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。对这一结论进行证明分成两部分,
这是矩阵最重要的分解形式。SVD分解的全称为“Singular Value Decomposition”,即通过矩阵的奇异值进行分解。SVD分解的优势在于,该方法对矩阵没有任何限制,对于任意形状的矩阵都适用。
结合SVD分解的公式,因为U和V都是标准正交矩阵,依据标准正交矩阵的性质 V T = V − 1 V^T = V^{-1} VT=V−1。
对于一个 m × n m×n m×n的矩阵 A A A,进行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在图像领域的应用很广泛,利用SVD分解,减少了一定的数据量但是依旧可以很好的表达图像的语义。