上节我们介绍了方阵的一种分解方式,如果矩阵不是方阵,是否能分解?如果能,该如何分解?这节我们介绍一种一般矩阵的分解方法,称为奇异值分解,这种方法应用非常广泛,如降维、推荐系统、数据压缩等。
矩阵非常重要,所以其分解方法也非常重要,方法也比较多,除了特征分解法,还有一种奇异值分解法(SVD)。它将矩阵分解为奇异向量和奇异值。通过奇异分解,我们会得到一些类似于特征分解的信息。然而,奇异分解有更广泛的应用。
每个实数矩阵都有一个奇异值分解,但不一定都有特征分解。例如,非方阵的矩阵就没有特征分解,这时我们只能使用奇异值分解。
奇异分解与特征分解类似,只不过这回我们将矩阵A分解成三个矩阵的乘积:
假设A是一个m×n矩阵,那么U是一个m×m矩阵,D是一个m×n矩阵,V是一个n×n矩阵。这些矩阵每一个都拥有特殊的结构,其中U和V都是正交矩阵,D是对角矩阵(注意,D不一定是方阵)。对角矩阵D对角线上的元素被称为矩阵A的奇异值。矩阵U的列向量被称为左奇异向量,矩阵V的列向量被称右奇异向量。
SVD最有用的一个性质可能是拓展矩阵求逆到非方矩阵上。奇异值分解,看起来很复杂,如果用Python来实现,却非常简单,具体请看如下示例:
import numpy as np Data=np.mat([[1,1,1,0,0], [2,2,2,0,0], [3,3,3,0,0], [5,5,3,2,2], [0,0,0,3,3], [0,0,0,6,6]]) u,sigma,vt=np.linalg.svd(Data) #print(u) print(sigma) #转换为对角矩阵 diagv=np.mat([[sigma[0],0,0],[0,sigma[1],0],[0,0,sigma[2]]]) print(diagv) #print(vt)
打印结果:
[ 1.09824632e+01 8.79229347e+00 1.03974857e+00 1.18321522e-15 2.13044868e-32] [[ 10.98246322 0. 0. ] [ 0. 8.79229347 0. ] [ 0. 0. 1.03974857]]