购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.7 奇异值分解

上节我们介绍了方阵的一种分解方式,如果矩阵不是方阵,是否能分解?如果能,该如何分解?这节我们介绍一种一般矩阵的分解方法,称为奇异值分解,这种方法应用非常广泛,如降维、推荐系统、数据压缩等。

矩阵非常重要,所以其分解方法也非常重要,方法也比较多,除了特征分解法,还有一种奇异值分解法(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)

打印结果: 8450gMvDvA5U70YcbpcHT4epqtg6kORNb70MYQ9VvvlJvmS9Tlv2zJcSngBT9Plx


[  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]]

点击中间区域
呼出菜单
上一章
目录
下一章
×