矩阵的奇异值分解(Singular Value Decomposition,SVD)是数值计算中的精彩之处,在其它数学领域和机器学习领域得到了广泛的应用,如矩阵的广义逆,主分成分析(PCA),自然语言处理(NLP)中的潜在语义索引(Latent Semantic Indexing),推荐算法等。
鉴于实际应用,本次分享中的数域为实数域,即我们只在实数范围内讨论。我们假定读者具有大学线性代数的水平。那么,矩阵的奇异值分解定理如下:
(定理)(奇异值分解定理)任意一个 m×n 矩阵A可分解为
其中P是 m×m 正交矩阵,D是 m×n 对角阵,Q是 n×n 正交矩阵。
证明:矩阵 ATA 是 n×n 对称矩阵,因为 (ATA)T=AT(AT)T=ATA .又因为
所以
ATA
是半正定矩阵,从而,
ATA
的特征值为非负数。
假设
ATA
的特征值为
σ21,σ22,...,σ2n
,其中,
σ21,σ22,...,σ2r
都是正的,
σ2r+1,σ2r+2,...,σ2n
都是0,
r
为
于是 (Aui)T(Aui)=uTi(ATA)ui=uTiσ2iui=σ2i. 当 i≥r+1 时, σi=0 ,从而 Aui=0 .
用 {uT1,uT2,...,uTn} 作为行构成一个 n×n 矩阵 Q .接着,定义
当 1≤i,j≤r 时, vi 构成一个标准正交系,这是因为
其中 δij 为Kronecker符号,即当 i=j 时, δ=1 ,当 i≠j 时, δ=0 .
我们选择额外的向量 vi 使得 {v1,v2,...,vm} 为 Rm 的标准正交基。设P是 m×m 矩阵,其列是 v1,v2,...,vm .设D是 m×n 对角阵, σ1,σ2,...σr 在其对角线上,其余地方均为0.于是有
这是因为 (PTAQT)ij=vTiAuj ,当 j≥r+1 时,该式为0,当 j≤r 时,该式为 vTiσvj=σjδij ,从而 PTAQT=D .又因 P,Q 为正交矩阵,因此
证毕。
在上面证明中,我们称实数 σ1,σ2,...,σn (取非负数)为矩阵A的奇异值,它们是 ATA 的特征值的非负平方根。定理中的分解 A=PDQ 就是一个奇异值分解。由上面的证明,我们可以知道:矩阵的奇异值分解并不唯一,因为 σ1,σ2,...,σn 的次序及 vr+1,vr+2,...,vn 的选择并不唯一。
在Python中的Numpy模块中,已经实现了矩阵的奇异值分解。以下为示例的应用代码:
import numpy as np
#generate a random 3*4 matrix
A = np.random.randint(5, size=(3, 4))
#parameter full_matrices: control the size of P and Q
#d returns as numpy.ndarray, not matrix
P,d,Q = np.linalg.svd(A, full_matrices=True)
print('A:',A)
print('P:',P)
#D return as diagonal 3*4 matrix
D = np.zeros(12).reshape(3,4)
for i in range(len(d)):
D[i][i] = d[i]
print('D:',D)
print('Q:',Q)
#check if P*D*Q == A
print('P*D*Q:',np.dot(P,np.dot(D,Q)))
输入结果如下:
至于如何用原始算法来实现矩阵的SVD,也是需要考虑的,有机会的话,可以交流哦~~
本次分享到此结束,欢迎大家批评与交流~~
参考文献:
- SVD 维基百科:https://en.wikipedia.org/wiki/SVD
- 数值分析 机械工业出版社 作者:萨奥尔(Timothy Sauer) 译者:裴玉茹
numpy的svd实现函数: https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.svd.html - 奇异值分解(SVD)原理与在降维中的应用:https://www.cnblogs.com/pinard/p/6251584.html
- 奇异值分解SVD应用——LSI:http://blog.csdn.net/abcjennifer/article/details/8131087
论文:CALCULATING THE SINGULAR VALUES AND PSEUDO-INVERSE OF A MATRIX, G. GOLUB AND W. KAHAN, J. SIAM llrM,B. AfeArd.Ser. B, Vol. 2, No. 2, 1965