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 pltfrom skimage import data

def 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)@vtr    return(img)

img = data.camera()/255.0

plt.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 PCA

from matplotlib import pyplot as pltfrom skimage import data

X = 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]]

此文章的原创作者:云哥,欢迎关注他的公众号。

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

  1. 精简易懂,30 分钟学会 SVD 矩阵分解,很强!

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 SVD(Singular Value Decomposition) ...

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

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

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

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

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

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

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

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

  6. 30 分钟学会 Flex 布局

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

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

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

  8. 30分钟学会专利提案

    30分钟学会专利提案 预期效果 引起重视 掌握套路 激发灵感 分享内容 6个问题 1.专利.发明专利.交底书.申请书? 专利分为发明.实用新型和外观设计三种类型 授予发明专利应当具备三性:新颖性.创造 ...

  9. 服务器可视化_疫情来袭,30分钟学会用python开发部署疫情可视化网站

    2019-nCov疫情实时数据可视化--30分钟python快速版 疫情来袭,宅在家不如学习用python如何开发并部署一个疫情实时追踪可视化页面.页面预览 本文将介绍如何使用python开发网站,「 ...

最新文章

  1. Find Large Files in Linux
  2. list字母排序 java_通过Java排序List集合的元素的几种方法
  3. The restricted headers are:
  4. 定义派生类和继承类(从汇编分析)
  5. 根据dtd编写xml的小例子
  6. 嘘,Python 优化提速的 8 个小技巧
  7. 使用.NET Core 2.1的Azure WebJobs
  8. 分子动力学模拟软件_功能玻璃专题——分子动力学模拟预测氧化钠含量对二元钠硅酸盐玻璃弹性模量的影响...
  9. 【转】ABP源码分析三十七:ABP.Web.Api Script Proxy API
  10. Python综合应用(1)--名片管理系统开发
  11. MySQL_数据库操作
  12. Don't stop pretraining,继续预训练!
  13. 哈工大理论力学第八版电子版_理论力学哈工大第八版1第一章思考题课后题
  14. python爬虫安装了pycharm还要安装什么_Pycharm安装与使用
  15. 电信用户流失预测Telco customer churn—(基于逻辑回归)
  16. leetcode[81]Search in Rotated Sorted Array II
  17. 深层和浅层卷积_浅层vs深层javascript
  18. Android常用固件修改
  19. wpa_supplicant-2.6 君正平台(Zeratul )编译 支持WPS功能
  20. 水滴IP告诉你:代理ip的功能是什么?能否隐藏自身的真实ip?

热门文章

  1. 437. Path Sum III
  2. loj #143. 质数判定
  3. 【原创】大数据基础之Hive(2)Hive SQL执行过程之SQL解析过程
  4. ht-8 对arrayList中的自定义对象排序( Collections.sort(ListT list, Comparator? super T c))...
  5. 2016012086+杨岚青+散列函数应用及安全性
  6. HTML5 Web SQL数据库
  7. Linux下xz与tar的区别
  8. 7款外观迷人的HTML5/CSS3 3D特效按钮特效
  9. {面试题6: 重建二叉树}
  10. Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例