热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入浅出解读奇异值分解,助你轻松掌握核心概念

一文让你通俗理解奇异值分解 觉得有用的话,欢迎一起讨论相互学习~ 原文来源七月在线,本文仅做学术分享,如有侵权请联系后台删除 特征值和奇异值在大部分人的印象中&#xff0c

一文让你通俗理解奇异值分解


觉得有用的话,欢迎一起讨论相互学习~


  • 原文来源七月在线,本文仅做学术分享,如有侵权请联系后台删除

特征值和奇异值在大部分人的印象中,往往是停留在纯粹的数学计算中。而且线性代数或者矩阵论里面,也很少讲任何跟特征值与奇异值有关的应用背景。

奇异值分解是一个有着很明显的物理意义的一种方法,它可以将一个比较复杂的矩阵用更小更简单的几个子矩阵的相乘来表示,这些小矩阵描述的是矩阵的重要的特性。就像是描述一个人一样,给别人描述说这个人长得浓眉大眼,方脸,络腮胡,而且带个黑框的眼镜,这样寥寥的几个特征,就让别人脑海里面就有一个较为清楚的认识,实际上,人脸上的特征是有着无数种的,之所以能这么描述,是因为人天生就有着非常好的抽取重要特征的能力,让机器学会抽取重要的特征,SVD是一个重要的方法。

在机器学习领域,有相当多的应用与奇异值都可以扯上关系,比如做feature reduction的PCA,做数据压缩(以图像压缩为代表)的算法,还有做搜索引擎语义层次检索的LSI(Latent Semantic Indexing)

一、特征值与奇异值

特征值分解和奇异值分解在机器学习领域都是属于满地可见的方法。两者有着很紧密的关系,接下来会谈到特征值分解和奇异值分解的目的都是一样,就是提取出一个矩阵最重要的特征。先谈特征值分解。

1.1 特征值

如果说一个向量v是方阵A的特征向量,将一定可以表示成下面的形式:

这时候λ就被称为特征向量v对应的特征值,一个矩阵的一组特征向量是一组正交向量。特征值分解是将一个矩阵分解成下面的形式:

其中Q是这个矩阵A的特征向量组成的矩阵,Σ是一个对角阵,每一个对角线上的元素就是一个特征值。我这里引用了一些参考文献中的内容来说明一下。

首先,要明确的是,一个矩阵其实就是一个线性变换,因为一个矩阵乘以一个向量后得到的向量,其实就相当于将这个向量进行了线性变换。比如说下面的一个矩阵:

它其实对应的线性变换是下面的形式:

因为这个矩阵M乘以一个向量(x,y)的结果是:

上面的矩阵是对称的&#xff0c;所以这个变换是一个对x&#xff0c;y轴的方向一个拉伸变换&#xff08;每一个对角线上的元素将会对一个维度进行拉伸变换&#xff0c;当值>1时&#xff0c;是拉长&#xff0c;当值<1时时缩短&#xff09;&#xff0c;当矩阵不是对称的时候&#xff0c;假如说矩阵是下面的样子&#xff1a;

它所描述的变换是下面的样子&#xff1a;

这其实是在平面上对一个轴进行的拉伸变换&#xff08;如蓝色的箭头所示&#xff09;&#xff0c;在图中&#xff0c;蓝色的箭头是一个最主要的变化方向&#xff08;变化方向可能有不止一个&#xff09;&#xff0c;如果我们想要描述好一个变换&#xff0c;那我们就描述好这个变换主要的变化方向就好了。反过头来看看之前特征值分解的式子&#xff0c;分解得到的Σ矩阵是一个对角阵&#xff0c;里面的特征值是由大到小排列的&#xff0c;这些特征值所对应的特征向量就是描述这个矩阵变化方向&#xff08;从主要的变化到次要的变化排列&#xff09;。

考虑更一般的非对称矩阵

很遗憾&#xff0c;此时我们再也找不到一组网格&#xff0c;使得矩阵作用在该网格上之后只有拉伸变换&#xff08;找不到背后的数学原因是对一般非对称矩阵无法保证在实数域上可对角化&#xff0c;不明白也不要在意&#xff09;。

我们退而求其次&#xff0c;找一组网格&#xff0c;使得矩阵作用在该网格上之后允许有拉伸变换和旋转变换&#xff0c;但要保证变换后的网格依旧互相垂直&#xff0c;这是可以做到的&#xff0c;如下图所示。

简言之&#xff0c;当矩阵是高维的情况下&#xff0c;那么这个矩阵就是高维空间下的一个线性变换&#xff0c;这个变换也同样有很多的变换方向&#xff0c;我们通过特征值分解得到的前N个特征向量&#xff0c;那么就对应了这个矩阵最主要的N个变化方向。我们利用这前N个变化方向&#xff0c;就可以近似这个矩阵&#xff08;变换&#xff09;。

也就是之前说的&#xff1a;提取这个矩阵最重要的特征。总结一下&#xff0c;特征值分解可以得到特征值与特征向量&#xff0c;特征值表示的是这个特征到底有多重要&#xff0c;而特征向量表示这个特征是什么&#xff0c;可以将每一个特征向量理解为一个线性的子空间&#xff0c;我们可以利用这些线性的子空间干很多的事情。不过&#xff0c;特征值分解也有很多的局限&#xff0c;比如说变换的矩阵必须是方阵。

下面我们就可以自然过渡到奇异值分解的引入。

1.2 奇异值

下面谈谈奇异值分解。特征值分解是一个提取矩阵特征很不错的方法&#xff0c;但是它只是对方阵而言的&#xff0c;在现实的世界中&#xff0c;我们看到的大部分矩阵都不是方阵&#xff0c;比如说有N个学生&#xff0c;每个学生有M科成绩&#xff0c;这样形成的一个N * M的矩阵就不可能是方阵&#xff0c;我们怎样才能描述这样普通的矩阵呢的重要特征呢&#xff1f;奇异值分解可以用来干这个事情&#xff0c;奇异值分解是一个能适用于任意的矩阵的一种分解的方法&#xff1a;

假设A是一个N * M的矩阵&#xff0c;那么得到的U是一个N * N的方阵&#xff08;里面的向量是正交的&#xff0c;U里面的向量称为左奇异向量&#xff09;&#xff0c;Σ是一个N * M的矩阵&#xff08;除了对角线的元素都是0&#xff0c;对角线上的元素称为奇异值&#xff09;&#xff0c;V’(V的转置)是一个N * N的矩阵&#xff0c;里面的向量也是正交的&#xff0c;V里面的向量称为右奇异向量&#xff09;&#xff0c;从图片来反映几个相乘的矩阵的大小可得下面的图片

那么奇异值和特征值是怎么对应起来的呢&#xff1f;首先&#xff0c;我们将一个矩阵A的转置 * A&#xff0c;将会得到一个方阵&#xff0c;我们用这个方阵求特征值可以得到&#xff1a;

这里得到的v&#xff0c;就是我们上面的右奇异向量。此外我们还可以得到&#xff1a;

这里的σ就是上面说的奇异值&#xff0c;u就是上面说的左奇异向量。奇异值σ跟特征值类似&#xff0c;在矩阵Σ中也是从大到小排列&#xff0c;而且σ的减少特别的快&#xff0c;在很多情况下&#xff0c;前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上了。也就是说&#xff0c;我们也可以用前r大的奇异值来近似描述矩阵&#xff0c;这里定义一下部分奇异值分解&#xff1a;

r是一个远小于m、n的数&#xff0c;这样矩阵的乘法看起来像是下面的样子&#xff1a;

右边的三个矩阵相乘的结果将会是一个接近于A的矩阵&#xff0c;在这儿&#xff0c;r越接近于n&#xff0c;则相乘的结果越接近于A。而这三个矩阵的面积之和&#xff08;在存储观点来说&#xff0c;矩阵面积越小&#xff0c;存储量就越小&#xff09;要远远小于原始的矩阵A&#xff0c;我们如果想要压缩空间来表示原矩阵A&#xff0c;我们存下这里的三个矩阵&#xff1a;U、Σ、V就好了。

说句大白话&#xff0c;称作「奇异值」可能无法顾名思义迅速理解其本质&#xff0c;那咱们换个说法&#xff0c;称作「主特征值」&#xff0c;你可能就迅速了然了。

而奇异值分解的几何含义为&#xff1a;对于任何的一个矩阵&#xff0c;我们要找到一组两两正交单位向量序列&#xff0c;使得矩阵作用在此向量序列上后得到新的向量序列保持两两正交。

继续拿1.1节的例子进一步阐述&#xff0c;奇异值的几何含义为&#xff1a;这组变换后的新的向量序列的长度。


奇异值的计算是一个难题&#xff0c;是一个O(N^3)的算法。在单机的情况下当然是没问题的&#xff0c;matlab在一秒钟内就可以算出1000 * 1000的矩阵的所有奇异值&#xff0c;但是当矩阵的规模增长的时候&#xff0c;计算的复杂度呈3次方增长&#xff0c;就需要并行计算参与了。Google的吴军老师在数学之美系列谈到SVD的时候&#xff0c;说起Google实现了SVD的并行化算法&#xff0c;说这是对人类的一个贡献&#xff0c;但是也没有给出具体的计算规模&#xff0c;也没有给出太多有价值的信息。

其实SVD还是可以用并行的方式去实现的&#xff0c;在解大规模的矩阵的时候&#xff0c;一般使用迭代的方法&#xff0c;当矩阵的规模很大&#xff08;比如说上亿&#xff09;的时候&#xff0c;迭代的次数也可能会上亿次&#xff0c;如果使用Map-Reduce框架去解&#xff0c;则每次Map-Reduce完成的时候&#xff0c;都会涉及到写文件、读文件的操作。个人猜测Google云计算体系中除了Map-Reduce以外应该还有类似于MPI的计算模型&#xff0c;也就是节点之间是保持通信&#xff0c;数据是常驻在内存中的&#xff0c;这种计算模型比Map-Reduce在解决迭代次数非常多的时候&#xff0c;要快了很多倍。

Lanczos迭代就是一种解对称方阵部分特征值的方法&#xff08;之前谈到了&#xff0c;解A’* A得到的对称方阵的特征值就是解A的右奇异向量&#xff09;&#xff0c;是将一个对称的方程化为一个三对角矩阵再进行求解。按网上的一些文献来看&#xff0c;Google应该是用这种方法去做的奇异值分解的。请见Wikipedia上面的一些引用的论文&#xff0c;如果理解了那些论文&#xff0c;也“几乎”可以做出一个SVD了。

二、奇异值的直观应用

2.1 女神图片压缩

下面&#xff0c;咱们从女神上野树里&#xff08;Ueno Juri&#xff09;的一张像素为高度450*宽度333的照片&#xff0c;来直观理解奇异值在物理上到底代表什么意义&#xff08;请屏幕前的痴汉暂停舔屏&#xff09;。

我们都知道&#xff0c;图片实际上对应着一个矩阵&#xff0c;矩阵的大小就是像素大小&#xff0c;比如这张图对应的矩阵阶数就是450*333&#xff0c;矩阵上每个元素的数值对应着像素值。我们记这个像素矩阵为A 现在我们对矩阵A进行奇异值分解。直观上&#xff0c;奇异值分解将矩阵分解成若干个秩一矩阵之和&#xff0c;用公式表示就是&#xff1a;

如果不满足的话重新排列顺序即可&#xff0c;这无非是编号顺序的问题。既然奇异值有从大到小排列的顺序&#xff0c;我们自然要问&#xff0c;如果只保留大的奇异值&#xff0c;舍去较小的奇异值&#xff0c;这样(1)式里的等式自然不再成立&#xff0c;那会得到怎样的矩阵——也就是图像&#xff1f;

结果就是完全看不清是啥……我们试着多增加几项进来&#xff1a;

再作图

隐约可以辨别这是短发伽椰子的脸……但还是很模糊&#xff0c;毕竟我们只取了5个奇异值而已。下面我们取20个奇异值试试&#xff0c;也就是(1)式等式右边取前20项构成

虽然还有些马赛克般的模糊&#xff0c;但我们总算能辨别出这是Juri酱的脸。当我们取到(1)式等式右边前50项时&#xff1a;

奇异值往往对应着矩阵中隐含的重要信息&#xff0c;且重要性和奇异值大小正相关。每个矩阵A都可以表示为一系列秩为1的“小矩阵”之和&#xff0c;而奇异值则衡量了这些“小矩阵”对于A的权重。

2.2 图像去噪

在图像处理领域&#xff0c;奇异值不仅可以应用在数据压缩上&#xff0c;还可以对图像去噪。如果一副图像包含噪声&#xff0c;我们有理由相信那些较小的奇异值就是由于噪声引起的。当我们强行令这些较小的奇异值为0时&#xff0c;就可以去除图片中的噪声。如下是一张25*15的图像

但往往我们只能得到如下带有噪声的图像&#xff08;和无噪声图像相比&#xff0c;下图的部分白格子中带有灰色&#xff09;&#xff1a;

通过奇异值分解&#xff0c;我们发现矩阵的奇异值从大到小分别为&#xff1a;14.15&#xff0c;4.67&#xff0c;3.00&#xff0c;0.21&#xff0c;……&#xff0c;0.05。除了前3个奇异值较大以外&#xff0c;其余奇异值相比之下都很小。强行令这些小奇异值为0&#xff0c;然后只用前3个奇异值构造新的矩阵&#xff0c;得到

可以明显看出噪声减少了&#xff08;白格子上灰白相间的图案减少了&#xff09;。奇异值分解还广泛的用于主成分分析&#xff08;Principle Component Analysis&#xff0c;简称PCA&#xff09;和推荐系统&#xff08;如Netflex的电影推荐系统&#xff09;等。在这些应用领域&#xff0c;奇异值也有相应的意义。

参考文献

1 https://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html

2 https://www.zhihu.com/question/22237507 3 We Recommend a Singular Value Decomposition&#xff08;Feature Column from the AMS&#xff09;

————

编辑 ∑Pluto

来源&#xff1a;七月算法
acc&scene&#61;21#wechat_redirect)


推荐阅读
  • 2017年苹果全球开发者大会即将开幕,预计iOS将迎来重大更新,同时Siri智能音箱有望首次亮相,AI技术成为大会焦点。 ... [详细]
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 丽江客栈选择问题
    本文介绍了一道经典的算法题,题目涉及在丽江河边的n家特色客栈中选择住宿方案。两位游客希望住在色调相同的两家客栈,并在晚上选择一家最低消费不超过p元的咖啡店小聚。我们将详细探讨如何计算满足条件的住宿方案总数。 ... [详细]
  • 基于Node.js、Express、MongoDB和Socket.io的实时聊天应用开发
    本文详细介绍了使用Node.js、Express、MongoDB和Socket.io构建的实时聊天应用程序。涵盖项目结构、技术栈选择及关键依赖项的配置。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • #print(34or4 ... [详细]
  • 本文探讨了为何相同的HTTP请求在两台不同操作系统(Windows与Ubuntu)的机器上会分别返回200 OK和429 Too Many Requests的状态码。我们将分析代码、环境差异及可能的影响因素。 ... [详细]
  • 离线安装Grafana Cloudera Manager插件并监控CDH集群
    本文详细介绍如何离线安装Cloudera Manager (CM) 插件,并通过Grafana监控CDH集群的健康状况和资源使用情况。该插件利用CM提供的API接口进行数据获取和展示。 ... [详细]
  • 本文详细介绍了如何在Kendo UI for jQuery的数据管理组件中,将行标题字段呈现为锚点(即可点击链接),帮助开发人员更高效地实现这一功能。通过具体的代码示例和解释,即使是新手也能轻松掌握。 ... [详细]
  • Python 工具推荐 | PyHubWeekly 第二十一期:提升命令行体验的五大工具
    本期 PyHubWeekly 为大家精选了 GitHub 上五个优秀的 Python 工具,涵盖金融数据可视化、终端美化、国际化支持、图像增强和远程 Shell 环境配置。欢迎关注并参与项目。 ... [详细]
  • 深入解析ESFramework中的AgileTcp组件
    本文详细介绍了ESFramework框架中AgileTcp组件的设计与实现。AgileTcp是ESFramework提供的ITcp接口的高效实现,旨在优化TCP通信的性能和结构清晰度。 ... [详细]
  • 本文旨在探讨如何利用决策树算法实现对男女性别的分类。通过引入信息熵和信息增益的概念,结合具体的数据集,详细介绍了决策树的构建过程,并展示了其在实际应用中的效果。 ... [详细]
  • LambdaMART算法详解
    本文详细介绍了LambdaMART算法的背景、原理及其在信息检索中的应用。首先回顾了LambdaMART的发展历程,包括其前身RankNet和LambdaRank,然后深入探讨了LambdaMART如何结合梯度提升决策树(GBDT)和LambdaRank来优化排序问题。 ... [详细]
author-avatar
mobiledu2502912677
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有