点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

SVD(Singular Value Decomposition)奇异值分解分解是机器学习中最重要的矩阵分解方法。

它能够将一个任意形状的矩阵分解成一个正交矩阵和一个对角矩阵以及另一个正交矩阵的乘积。

SVD分解具有非常深刻的几何含义。矩阵实际上对应着一种线性变换,一个矩阵作用到一个向量上,会得到一个新的向量。任何一个矩阵的操作效果可以分解成一次旋转,一次拉伸和维度改变,以及另外一次旋转三者作用效果的合成。

SVD分解通常用于数据压缩和数据降维。用于数据降维时,既可以对列降维,也可以对行降维,其中对列的降维等价于PCA的降维。

不仅如此,SVD算法还可以用于在声音和图像处理中剥离背景信号,在推荐算法中也经常出现它的身影。

一,SVD矩阵分解简介

SVD分解将任意矩阵分解成一个正交矩阵和一个对角矩阵以及另一个正交矩阵的乘积。

对角矩阵的对角元称为矩阵的奇异值,可以证明,奇异值总是大于等于0的。

当对角矩阵的奇异值按从大到小排列时,SVD分解是唯一的。

SVD分解有着非常深刻的几何含义。

矩阵实际上是对应着一种线性变换。一个矩阵作用到一个向量上,会得到一个新的向量。任何一个矩阵的操作效果可以分解成一次旋转,一次拉伸和维度改变,以及另外一次旋转三者作用效果的合成。

注意正交矩阵和作用到向量后是不会改变向量长度的,所以对应着旋转变换。

二,SVD分解的数学推演

 可以推出

依然是对角矩阵,又U为正交矩阵。

所以 为AA^T的相似对角矩阵,其对角元为AA^T的特征值,U由其对应特征向量构成,这些向量称为A的左奇异向量。

因此的对角元为AA^T特征值的平方根,称之为矩阵A的奇异值。

类似地V由A^TA的特征向量构成,这些向量称为A的右奇异向量。

三,SVD分解和数据压缩

奇异值描述了矩阵对应的拉伸变换在各个方向的比例,是矩阵的重要特征。

奇异值的分布通常非常不均,在很多的情况下前10%甚至1%的奇异值之和就占了全部奇异值之和的99%以上。

因此我们可以用前个大的奇异值来近似的描述矩阵。

这就是SVD分解用来进行数据压缩的原理。

假设 m = 10000,n = 8000,原来存储矩阵A需要存储8000万个数字,如果经过奇异值分解发现前100个奇异值贡献了99%的奇异值之和,于是可以近似只保留这100个奇异值及对应的左右奇异向量,那么只需要保留100+10000×100+100×8000= 180.01万个数字,只有原来的不到2.3%。

# 下面的范例示范SVD分解用于图片数据压缩。
%matplotlib inline
%config InlineBackend.figure_format = 'svg'
import numpy as np
from matplotlib import pyplot as plt
from skimage import datadef compressBySVD(img,r):u,s,vt = np.linalg.svd(img)ur = u[:,0:r]sr = s[0:r]vtr = vt[0:r,:]return (ur,sr,vtr)def rebuildFromSVD(ur,sr,vtr):img = ur@np.diag(sr)@vtrreturn(img)img = data.camera()/255.0plt.figure(figsize=(10,8))
for i,r in enumerate([5,10,20,30,40,50,100,200],start = 1):ur,sr,vtr = compressBySVD(img,r)compress_ratio = (np.product(ur.shape) + len(sr) + np.product(vtr.shape))/np.product(img.shape)img_rebuild = rebuildFromSVD(ur,sr,vtr)ax=plt.subplot(3,3,i)ax.imshow(img_rebuild,cmap = "gray")ax.set_title("r=%d"%r+", compress_ratio=%.2f"%compress_ratio)ax.set_xticks([])ax.set_yticks([]) ax = plt.subplot(3,3,9)
ax.imshow(img,cmap = "gray")
ax.set_title("r = 512, original image")
ax.set_xticks([])
ax.set_yticks([]) plt.show()

四,SVD分解和PCA降维

PCA降维可以看成是SVD分解的一个应用。PCA降维使用的变换矩阵恰好是SVD分解的右奇异矩阵。

实际上,由于SVD分解存在着无需通过计算特征值和特征向量的可并行的数值迭代计算算法,sklearn的PCA降维算法正是通过SVD分解计算的。

下面证明SVD分解的右奇异向量构成的矩阵恰好是PCA算法所需要的正交变换矩阵。

假定PCA对应的正交变换矩阵为,根据PCA算法的数学原理,

由协方差矩阵 的各个特征向量组成,它能够将协方差矩阵相似对角化。

其中为的相似对角矩阵,且对角元由大到小排列。

利用的SVD矩阵分解:

我们有

根据SVD分解的数学原理,也是 的相似对角矩阵,且对角元由大到小排列。

于是有:

于是右奇异向量构成的矩阵 ???? 恰好是PCA算法所需要的正交变换矩阵 ????。

注意到PCA算法实际上是一种列降维的方法,实际上利用SVD分解的左奇异矩阵也可以对矩阵进行行降维。

# 演示SVD用于PCA降维的计算%matplotlib inline
%config InlineBackend.figure_format = 'svg'
import numpy as np
from sklearn.decomposition import PCAfrom matplotlib import pyplot as plt
from skimage import dataX = np.array([[-1.0, -3, -2], [-2, -1, -3], [-3, -2, -5], [2, 1, 3], [6, 1, 3], [2, 2, 3]])pca = PCA(n_components= 2)
X_new = pca.fit_transform(X)
print("\ndecomposition by pca:")
print("singular value:")
print(pca.singular_values_)
print("X_new:")
print(X_new)print("\ndecomposition by svd:")
U,S,Vt = np.linalg.svd(X-X.mean(axis = 0))
print("singular value:\n",S[:2])
print("X_new:")
print(np.dot(X-X.mean(axis = 0),np.transpose(Vt)[:,0:2]))# 注:降维结果中正负号的差异是因为PCA调整了SVD分解后的U和Vt符号以保持各列最大值取正

输出如下:

decomposition by pca:
singular value:
[11.31375337  2.89544001]
X_new:
[[ 3.23378083  1.06346839][ 3.88607412 -0.50763321][ 6.25267378  0.08479886][-3.50509914 -0.96584476][-6.02398361  1.89494314][-3.84344598 -1.56973242]]decomposition by svd:
singular value:[11.31375337  2.89544001]
X_new:
[[-3.23378083 -1.06346839][-3.88607412  0.50763321][-6.25267378 -0.08479886][ 3.50509914  0.96584476][ 6.02398361 -1.89494314][ 3.84344598  1.56973242]]

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

精简易懂,30 分钟学会 SVD 矩阵分解,很强!相关推荐

  1. sklearn 相似度矩阵_精简易懂,30 分钟学会 SVD 矩阵分解,很强!

    SVD(Singular Value Decomposition)奇异值分解分解是机器学习中最重要的矩阵分解方法. 它能够将一个任意形状的矩阵分解成一个正交矩阵和一个对角矩阵以及另一个正交矩阵的乘积. ...

  2. 统计学习方法第十五章作业:SVD矩阵分解 代码实现 及其在推荐的应用和矩阵压缩意义

    SVD矩阵分解 import numpy as npclass SVD:def __init__(self,x):self.x = np.array(x)def get_r_rv(self,x):x ...

  3. 基于SVD矩阵分解的用户商品推荐(python实现)

    加粗样式## SVD矩阵分解 SVD奇异值分解 优点:简化数据,去除噪声,提高算法的结果 缺点:数据的转换可能难以理解 适用范围:数值性数据 原始数据data,我们把它分解成3个矩阵. 其中 只有对角 ...

  4. Pyechart:30分钟学会pyecharts数据可视化

    30分钟学会pyecharts数据可视化 小红:你先跟我说说什么是pyecharts吧. 小明:Echarts 是一个由百度开源的数据可视化javascript库,凭借着良好的交互性,精巧的图表设计, ...

  5. 【转】30分钟学会UML类图

    转自:30分钟学会UML类图 - 知乎 30分钟学会UML类图 肖继潮 UML图有很多种,但是并非必须掌握所有的UML图,才能完整系统分析和设计工作.一般说来,在UML图中,只要掌握类图.用例图.时序 ...

  6. 30 分钟学会 Flex 布局

    30 分钟学会 Flex 布局 关注公众号 风色年代(itfantasycc) 更多好玩的前端资料等你拿~~ 林东洲 30 分钟学会 Flex 布局 - 知乎 (zhihu.com) 为什么我要写这一 ...

  7. python程序-30分钟学会用Python编写简单程序

    原标题:30分钟学会用Python编写简单程序 参与文末每日话题讨论,赠送异步新书 异步图书君 学习目标 知道有序的软件开发过程的步骤. 了解遵循输入.处理.输出(IPO)模式的程序,并能够以简单的方 ...

  8. python写软件实例-30分钟学会用Python编写简单程序

    原标题:30分钟学会用Python编写简单程序 参与文末每日话题讨论,赠送异步新书 异步图书君 学习目标 知道有序的软件开发过程的步骤. 了解遵循输入.处理.输出(IPO)模式的程序,并能够以简单的方 ...

  9. 30分钟学会EventBus3 0详解(二)(EventBus3 0的详细使用)(by星空武哥)

    转载声明原创地址:http://blog.csdn.net/lsyz0021/article/details/52094855 30分钟学会EventBus3.0详解(一)(引入和初始化EventBu ...

最新文章

  1. BeagleBone Black快速入门教程
  2. hadoop 部分问题
  3. ASP.Net服务性能优化原则
  4. log4j 新建日志 重启_Log4j 动态修改日志级别,不用重启服务器
  5. winpe+linux iso,用syslinux引导maxdos,winpe,slax l
  6. 计算机屏保黑屏取消,电脑怎么取消屏保黑屏
  7. 那智机器人工具坐标设置方法
  8. OpenCV图像锐化
  9. win10右键卡顿原因_win10右键新建卡顿怎么办
  10. 加拿大办理电动自行车申请GCC认证
  11. 【Beta】 第六次Daily Scrum Meeting
  12. 合宙Air105 + GC032A摄像头驱动显示教程说明
  13. VUE项目初始化报[404 Not Found - GET https://r.cnpmjs.org/xxxx]
  14. java日志,需要知道的几件事(commons-logging,log4j,slf4j,logback)
  15. andorid 问题集合
  16. python错误找回_python字典键错误无法恢复
  17. nestjs[typeorm学习之一对一表关系探究与使用]
  18. 北京功略----购物篇
  19. 中国 省级 单位 的 字母 简称 和 字母 排列 顺序
  20. 5行代码带你爬取 “2021福布斯排行榜“,看看中国都有哪些人?

热门文章

  1. 触类旁通,经典面试题最长公共子序列应该这么答
  2. 全球首款L4级无人车量产!李彦宏:吹过的牛实现了
  3. RabbitMQ 延迟队列,太实用了!
  4. 有了这款可视化工具,Java 应用性能分析、调优 so easy...
  5. 聊一聊如何优雅地向程序员提问题
  6. 机器学习中的L1与L2正则化图解!
  7. 数据统计脚本(汇总)
  8. 【廖雪峰python进阶笔记】类的继承
  9. 大神开发arXiv全新H5版,一步告别公式排版错误,手机也能轻松看文献
  10. 两位MIT学霸,25岁退学,40岁完成800亿IPO!