机器学习 | SVD分解

1 前言

经常看到SVD奇异值分解,但一直没有去了解它讲的什么,刚好在李航老师统计学习方法第二版上是单独的一章,下面看了一些博客总结一下~

2 SVD的来龙去脉

2.1 概念

  • 奇异值分解:singular value decomposition(简称SVD)是一种矩阵因子分解的方法。
  • 具体来说:任意一个 m × n m×n m×n的矩阵,都可以表示成三个矩阵的乘积(即因子分解)形式:

任意一个 m × n m×n m×n的矩阵 = m m m阶正交阵 × × × 降序排列的非负对角线元素组成的 m × n m×n m×n对角阵 × × × n n n阶正交阵

  • 另外矩阵的奇异值分解一定存在,但不唯一(因为特征向量表示可以不唯一)
  • 奇异值分解可以看作是矩阵数据压缩的一种方法,即用因子分解的方式近似地表示原始矩阵,这种近似是在平方损失意义下的最优近似

2.2 为什么要做特征值分解以及为什么会出现SVD?

首先,对于方阵我们是可以直接分解的,比较简单,(也是考研那时候数学必考题),即一个方阵等于三部分乘积,中间是特征值组成的,两边是特征向量组成的矩阵以及它的逆。这部分就属于基础的线性代数部分了,具体见下图:
在这里插入图片描述
ok,有小伙伴就会问了,为什么要做上述的分解?我记得考研那时候宇哥就说过,分解成这样的形式,最后矩阵就可以写成二项式的形式了,比如如果特征值为1,2,3,那么A就可以表示成
f = x 1 2 + 4 x 2 2 + 9 x 3 2 f={x_1}^2+4{x_2}^2+9{x_3}^2 f=x12+4x22+9x32 ,写成这样更简单?具体我也有点遗忘了,但今天看到一篇写的很好地博客,里面做出了解释,即为什么要做矩阵的特征值分解?

  • 结论:特征分解的过程其实是在提取这个矩阵最重要的特征
  • 首先对矩阵不论是左乘还是右乘,本质是在做线性变换,而如果我们想要描述好一个变换,那我们就描述好这个变换主要的变化方向就好了。
  • 其次怎么衡量这个主要变化方向呢?其实是看特征值的大小!分解得到的 Σ Σ Σ矩阵是一个对角阵,里面的特征值是由大到小排列的,这些特征值所对应的特征向量就是描述这个矩阵变化方向(从主要的变化到次要的变化排列)
  • 最后总结下,特征值分解可以得到特征值与特征向量,特征值表示的是 这个特征到底有多重要,而特征向量表示 这个特征是什么,可以将每一个特征向量理解为一个线性的子空间,我们可以利用这些线性的子空间干很多的事情。

ok,上面提到了矩阵的特征值分解的目的是提取特征的最重要的特征,特征值是表示这个特征到底多重要,而特征向量表示这个特征是什么意思,那既然有了矩阵的特征值分解,还为什么要有个奇异值分解呢?

原因是上面提到了矩阵的特征值分解必须为方阵!而现实生活很多实际场景并不一定就是方阵,很可能行和列不一致,那这时候我们同样希望能够提取特征,该怎么处理呢?奇异值分解SVD!

2.3 SVD的原理

上面的2.2小节提到了SVD是我们用来分解普通的矩阵(非方阵),进而描述普通矩阵的重要特征!那具体是如何实现的呢?首先上两张特别好的图:

  • 完全奇异值分解:
    在这里插入图片描述
  • 部分奇异值分解:
    在这里插入图片描述

2.3.1 完全奇异值分解过程

  • 将矩阵A分解为 U U U ∑ \sum V T V^T VT
  • U U U:正交阵,每个特征向量称为左奇异向量。基于 A A T AA^T AAT的特征向量组成!
  • V T V^T VT:正交阵,每个特征向量称为右奇异向量。基于 A T A A^TA ATA的特征向量组成!
  • ∑ \sum :基于 A T A A^TA ATA计算出来的特征值再开根号!即奇异值!其实也很好理解为什么开根号,弄清楚 A T A A^TA ATA A A A的特征值关系就ok!

上述就是完全奇异值分解的过程,其实工作还是比较简单的,就涉及到了线代中求矩阵的特征值和特征向量!以及矩阵乘积的运算!

2.3.2 部分奇异值分解

  • 上述的第二张图片就展示了部分奇异值分解的过程,具体的参数就不再一一解释,和上述2.3.1基本一致,唯一的变化就是 U U U ∑ \sum V T V^T VT的维度发生了变化!
  • r r r是远小于 m m m的! r r r越接近于 n n n,则相乘的结果越接近于 A A A
  • 而这三个矩阵的面积之和(在存储观点来说,矩阵面积越小,存储量就越小)要远远小于原始的矩阵 A A A,我们如果想要压缩空间来表示原矩阵 A A A,我们存下这里的三个矩阵: U U U ∑ \sum V T V^T VT就好了。

相信大家肯定有疑问,上面这种部分分解好是好,但为什么可以这么做呢?

因为在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上了。也就是说,我们也可以用前 r r r大的奇异值来近似描述矩阵

3 SVD的举例

这里借用刘建平老师的博客的例子:
在这里插入图片描述
同时,我们可以在一个WolframAlpha网站计算,计算结果见下图:
在这里插入图片描述
结果一致,完美!

4 SVD的应用

4.1 应用1 PCA

  • 在之前的博客:机器学习 | 线性判别分析LDA和主成分分析PCA 中,我们讲到要用PCA降维,需要找到样本协方差矩阵 X T X X^TX XTX的最大的d个特征向量,然后用这最大的d个特征向量张成的矩阵来做低维投影降维。
  • 可以看出,在这个过程中需要先求出协方差矩阵 X T X X^TX XTX,当样本数多样本特征数也多的时候,这个计算量是很大的。
  • 神奇的是,我们的SVD也可以得到协方差矩阵 X T X X^TX XTX最大的d个特征向量张成的矩阵,但是SVD有个好处,有一些SVD的实现算法可以不用先求出协方差矩阵 X T X X^TX XTX,也能求出我们的右奇异矩阵 V T V^T VT。也就是说,我们的PCA算法可以不用做特征分解,而是做SVD来完成。这个方法在样本量很大的时候很有效。
  • 实际上,scikit-learn的PCA算法的背后真正的实现就是用的SVD,而不是我们我们认为的暴力特征分解。

但有一个小的问题,上述PCA用到的也仅仅是SVD的右奇异矩阵 V T V^T VT,左奇异矩阵是否有用武之地呢?答案是有的。

  • 实现行数的压缩!
    在这里插入图片描述
    小结一下:

  • SVD的奇异矩阵用于行数的压缩

  • SVD的奇异矩阵用于特征维度的压缩,即PCA降维!

4.2 应用2 潜在语义索引LSI

这个也是比较有意思的一个实际问题,吴军老师在数学之美这本书也提到了这个问题。我们来稍微概括总结一下:

案例背景:如何对新闻进行分类呢?即一篇一篇的文章,如何给它对应到相对应的主题?

书中吴军老师提到了两种方法:

首先是对文档进行分词,然后根据TF-IDF来计算词汇的重要性得分!于是将一篇文档变成了数值,即TF-IDF得分向量。接下来就采用模型的方法进行分类处理!

  • 方法1基于余弦定理的方式进行分类。即如果两篇文档的向量夹角很小,认为相关性很强,如果夹角接近90度,认为基本不相关!但是这样有一个问题就是如果算两两文档的夹角余弦,一旦样本量增大到一定程度,计算效率就会特别的低下,这时候可以有几种优化的方法:
    • 向量的长度部分不需要重复计算。算一个存一个后面调用
    • 计算分子,两个向量的内积的时候只考虑非0元素
    • 删除虚词!虚词其实是噪音,干扰正常分类!和通信中的过滤掉低频噪音原理类似!
    • 位置加权!开头和结尾比中间重要,标题比正文更重要!
  • 方法2基于SVD分解的方式进行分类。

SVD分解用于新闻分类的一个很朴素的思想就是:能不能一次性把所有新闻的相关性算出来呢?答案是可以的!具体见下文的实例:

之前的预处理后的数据格式为:
在这里插入图片描述
SVD分解之后的为:
在这里插入图片描述
如何解读上述分解的结果呢?

  • 可以理解为分出了3个主题。
  • 左奇异矩阵可以看到不同词汇属于不同主题的概率,这样就可以得出不同词汇之间的相关性
  • 右奇异矩阵可以看到不同文章属于不同主题的概率,这样就可以得到不同文章之间的相关性了!
  • 如果右奇异矩阵每列取max,其余为0,就实现了文本分类的效果了!

这个案例的详细版本可以见:机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用

后续还进行了降维,二维平面可视化,实现了聚类的效果,完美!

5 SVD的优缺点

5.1 优点

  • 不需要迭代,速度较快
  • 实现降维,能够简化数据规模,去除噪声

5.2 缺点

  • 分解出的矩阵解释性往往不强,有点黑盒子的味道,不过这不影响它的使用。
  • 分类结果往往比较粗糙。

适用数据类型:数值型数据

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值