SVD分解

        奇异值分解(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

线性代数-第四版-同济大学

 

 

 

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值