分享

【简化数据】奇异值分解(SVD)

 心不留意外尘 2016-03-28

from http://blog.csdn.net/u012162613/article/details/42214205

2014-12-28 15:28  

目录(?)[+]

【简化数据】奇异值分解(SVD)

@author:wepon

@blog:http://blog.csdn.net/u012162613/article/details/42214205


1、简介

奇异值分解(singular Value Decomposition),简称SVD,线性代数中矩阵分解的方法。假如有一个矩阵A,对它进行奇异值分解,可以得到三个矩阵:


这三个矩阵的大小:


矩阵sigma(即上图U和V中间的矩阵)除了对角元素不为0,其他元素都为0,并且对角元素是从大到小排列的,前面的元素比较大,后面的很多元素接近0。这些对角元素就是奇异值。

sigma中有n个奇异值,但是由于排在后面的很多接近0,所以我们可以仅保留比较大的r个奇异值:



实际应用中,我们仅需保留着三个比较小的矩阵,就能表示A,不仅节省存储量,在计算的时候更是减少了计算量。SVD在信息检索(隐性语义索引)、图像压缩、推荐系统、金融等领域都有应用。


在上一篇文章主成分分析中,我是通过特征值分解的方法来实现PCA的,除了特征值分解,还可以用奇异值分解来实现PCA。特征值和奇异值二者之间是有关系的:上面我们由矩阵A获得了奇异值sigma(i),假如方阵A*A'的特征值为lamda(i),则:sigma(i)^2=lamda(i)。可以发现,求特征值必须要求矩阵是方阵,而求奇异值对任意矩阵都可以,因此PCA的实现其实用SVD的更多,在scikit-learn中,PCA算法其实也是通过SVD来实现的。



2、在python中使用SVD

numpy中的linalg已经实现了SVD,可以直接调用

[python] view plain copy
  1. >>> A=mat([[1,2,3],[4,5,6]])  
  2. >>> from numpy import linalg as la  
  3. >>> U,sigma,VT=la.svd(A)  
  4. >>> U  
  5. matrix([[-0.3863177 , -0.92236578],  
  6.         [-0.92236578,  0.3863177 ]])  
  7. >>> sigma  
  8. array([ 9.508032  ,  0.77286964])  
  9. >>> VT  
  10. matrix([[-0.42866713, -0.56630692, -0.7039467 ],  
  11.         [ 0.80596391,  0.11238241, -0.58119908],  
  12.         [ 0.40824829, -0.81649658,  0.40824829]])  

有一点需要注意,sigma本来应该跟A矩阵的大小2*3一样,但linalg.svd()只返回了一个行向量的sigma,并且只有2个奇异值(本来应该有3个),这是因为第三个奇异值为0,舍弃掉了。之所以这样做,是因为当A是非常大的矩阵时,只返回奇异值可以节省很大的存储空间。当然,如果我们要重构A,就必须先将sigma转化为矩阵。



推荐文章,也是本文参考的一篇文章:机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多