奇异值分解(Singular Value Decomposition,以下简称SVD)是矩阵分解中三大分解方法之一,另外2个为LR分解以及QR分解。
奇异值分解对矩A进行分解,得到了3个矩阵的乘积:
改:右奇异向量,是A^TA的正交特征向量。S是A^TA也是AA^T的特征值平方根。
也就是说,左奇异矩阵可以用于行数的压缩。相对的,右奇异矩阵可以用于列数即特征维度的压缩。
SVD求解步骤:
(1)利用矩阵A计算出AA^T矩阵、A^TA矩阵;
(2)计算出AA^T(左奇异矩阵)和A^TA(右奇异矩阵)求出特征值和特征向量;对应的单位化过的特征向量为T,将特征值降序排列后对应的单位化过的特征向量为D;
(3)利用特征值的平方根构成的对角矩阵为矩阵S;
(4)按照前S个取出降维后的矩阵A_K。
SVD例子
通过numpy进行程序的实验。
(1)打印出矩阵H和转置矩阵H.T
H = array([[3,52,],[8,43],[1,24]]);
print(H)
[[ 3 52]
[ 8 43]
[ 1 24]]
print(H.T)
[[ 3 8 1]
[52 43 24]]
(2)打印H*H.T以及H.T乘以H
print(dot(H,H.T))
[[2713 2260 1251]
[2260 1913 1040]
[1251 1040 577]]
print(dot(H.T,H))
[[ 74 524]
[ 524 5129]]
(3)打印H*H.T的特征值和特征矩阵
x = matrix([[2713,2260,1251],[2260,1913,1040],[1251,1040,577]])
a,b=linalg.eig(x)
print(a)
[5.18274626e+03 2.02537409e+01 2.52004081e-13]
print(b)
[[-0.72279171 -0.51582325 -0.45988969]
[-0.6055156 0.79343572 0.06173016]
[-0.33305105 -0.32308843 0.88582778]]
(4)打印H.T*H的特征值和特征矩阵
x = matrix([[74,524],[524,5129]])
a,b=linalg.eig(x)
print(a)
[ 20.25374092 5182.74625908]
print(b)
[[-0.99478092 -0.10203388]
[ 0.10203388 -0.99478092]]
(5)U, S, V = linalg.svd(H)
print (U)
[[ 0.72279171 -0.51582325 -0.45988969]
[ 0.6055156 0.79343572 0.06173016]
[ 0.33305105 -0.32308843 0.88582778]]
print (S)
[71.99129294 4.50041564]
print (V)
[[ 0.10203388 0.99478092]
[ 0.99478092 -0.10203388]]
注:
如果矩阵H为方阵时,H.T*H和H*H.T的结果是一致的。
参考目录
https://www.cnblogs.com/pinard/p/6251584.html
https://blog.csdn.net/u010099080/article/details/68060274
https://www.jianshu.com/p/310b55c791de
程序员数学3
线性代数-第四版-同济大学