前言

在项目实战的特征工程中遇到了采用SVD进行降维,具体SVD是什么,怎么用,原理是什么都没有细说,因此特开一篇,记录下SVD的学习笔记

参考:刘建平老师博客 https://www.cnblogs.com/pinard/p/6251584.html

奇异值分解(SVD)原理与在降维中的应用

回顾特征值和特征向量

考研学习线代到最后的内容,也是考研的难点就是求一个矩阵特征值,特征向量,以及求正定矩阵,标准正交化。

但是因为要进行特征分解,矩阵A必须为方阵。那么如果A不是方阵,即行和列不相同时,我们还可以对矩阵进行分解吗?

答案是可以,此时我们的SVD登场了。

SVD的定义

简单来说,假设我们的矩阵A是一个m×n的矩阵,A的转置和A做矩阵乘法,那么会得到n×n的一个方阵ATA。既然ATA是方阵,那么我们就可以进行特征分解,

这样我们就可以得到矩阵ATA的n个特征值和对应的n个特征向量v了。将ATA的所有特征向量张成一个n×n的矩阵V,就是我们SVD公式里面的V矩阵了。一般我们将V中的每个特征向量叫做A的右奇异向量

如果我们将A和A的转置做矩阵乘法,那么会得到m×m的一个方阵AAT。既然AAT是方阵,那么我们就可以进行特征分解,

这样我们就可以得到矩阵AAT的m个特征值和对应的m个特征向量u了。将AAT的所有特征向量张成一个m×m的矩阵U,就是我们SVD公式里面的U矩阵了。一般我们将U中的每个特征向量叫做A的左奇异向量

U和V我们都求出来了,现在就剩下奇异值矩阵Σ没有求出了。由于Σ除了对角线上是奇异值其他位置都是0,那我们只需要求出每个奇异值σ就可以了

我们注意到:

A=UΣVT⇒AV=UΣVTV⇒AV=UΣ⇒Avi=σiui⇒σi=Avi/ui

这样我们可以求出我们的每个奇异值,进而求出奇异值矩阵Σ。

进一步我们还可以看出我们的特征值矩阵等于奇异值矩阵的平方,这样也就是说,我们可以不用σi=Avi/ui来计算奇异值,也可以通过求出ATA的特征值取平方根来求奇异值。

SVD的一些性质

对于奇异值,它跟我们特征分解中的特征值类似,在奇异值矩阵中也是按照从大到小排列,而且奇异值的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上的比例。也就是说,我们也可以用最大的k个的奇异值和对应的左右奇异向量来近似描述矩阵。

就是说一个大的矩阵A可以用三个小的矩阵表示

SVD小结

SVD作为一个很基本的算法,在很多机器学习算法中都有它的身影,特别是在现在的大数据时代,由于SVD可以实现并行化,因此更是大展身手。SVD的原理不难,只要有基本的线性代数知识就可以理解,实现也很简单因此值得仔细的研究。当然,SVD的缺点是分解出的矩阵解释性往往不强,有点黑盒子的味道,不过这不影响它的使用。

最新文章

  1. PHP代码获取客户端IP地址经纬度及所在城市
  2. sql表别名
  3. Paxos算法与Zookeeper分析
  4. spring mvc+ELK从头开始搭建日志平台
  5. Linux 环境下开机自启动Oracle服务
  6. 在Linux下进行磁盘分区
  7. memcache 存储session
  8. 你知道C/S和B/S两种架构有什么区别吗?
  9. Mssql显错和不显错模式下的注入
  10. Android ActionBar完全解析,使用官方推荐的最佳导航栏(下) .
  11. python字典构造函数dict(mapping)解析
  12. Ubuntu的Redis安装
  13. Servlet支持上传多张图片
  14. hdu1541 Stars 树状数组
  15. linux svn up 中文显示乱码解决办法
  16. 面向对象编程总结--Python
  17. leetcode — simplify-path
  18. getting data from the keybroad
  19. 线特征---LBD算法(三)
  20. Redux系列01:从一个简单例子了解action、store、reducer

热门文章

  1. MyBatis项目创建
  2. HashSet存储自定义类型元素和LinkedHashSet集合
  3. 洛谷P4017 最大食物链数量 dfs
  4. 【docker专栏2】CentOS操作系统安装DockerCE
  5. golang面试-代码编写题1-14
  6. vue2升级vue3指南(二)—— 语法warning&error篇
  7. Rust 从入门到精通01-简介
  8. Bika LIMS 开源LIMS集—— SENAITE的使用(分析/测试、方法)
  9. YII behaviors使用
  10. Lua 语言