葫芦书第四章——降维
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了葫芦书第四章——降维相关的知识,希望对你有一定的参考价值。
参考技术A在机器学习中,数据通常需要被表示为向量形式以输入模型进行训练。但众所周知,对高维向量进行处理和分析时,会极大地消耗系统资源,甚至产生维度灾难(相关笔记记录于 这里 )。因此,用一个低维度的向量表示原始高维度的特征就显得尤为重要。
在机器学习领域中,我们对原始数据进行特征提取,有时会得到比较高维的特征向量。在这些向量所处的高维空间中,包含很多的冗余和噪声。我们希望通过降维的方式来寻找数据内部的特性,从而提升特征表达能力,降低训练复杂度。主成分分析(PCA)作为降维中最经典的方法,属于一种 线性、非监督、全局的降维算法 。
1、所谓主成分,就是把原特征进行线性组合后得到新的特征,此特征尽可能多地保留了原特征的方差。
2、设一组参数 ,记原特征为 ,新特征为 ,根据定义,我们要让 的方差尽可能大,即 这就是我们的目标函数。
3、具体的求解过程要借助特征值分解。
(a)是二维空间中经过中心化的一组数据,我们很容易看出主成分所在的轴(以下称为主轴)的大致方向,即(b)中黄线所处的轴。因为在黄线所处的轴上,数据分布得更为分散,这也意味着数据在这个方向上方差更大。
我们不难引出 PCA的目标,即最大化投影方差,也就是让数据在主轴上投影的方差最大 。对于给定的一组数据点 ,其中所有向量均为列向量,中心化后的表示为 ,其中 。我们知道,向量内积在几何上表示为第一个向量投影到第二个向量上的长度,因此向量 在 (单位方向向量)上的投影坐标可以表示为 。所以目标是找到一个投影方向 ,使得 在 上的投影方差尽可能大。易知,投影之后均值为0( ),因此投影后方差可以表示为:
其中 其实就是协方差矩阵,我们将其写为 ,另外,由于 是单位向量,因此 ,因此我们要求解一个最大化问题:
引入拉格朗日乘子并对 求导令其等于0,便可以推出 ,此时:
不难看出, 投影后的方差就是协方差矩阵的特征值。我们要找到最大的方差也就是协方差矩阵最大的特征值,最佳投影方向就是最大特征值所对应的特征向量。次佳投影方向位于最佳投影方向的正交空间中,是第二大特征值对应的特征向量,以此类推。至此,我们得到了PCA的求解方法:
1)对样本数据进行中心化处理。
2)求样本协方差矩阵。
3)对协方差矩阵进行特征值分解,将特征值从大到小排列。
4)取特征值前 大对应的特征向量 通过以下映射将 维样本映射到 维:
定义降维后的信息占比为:
可以。从线性回归的角度切入,最佳投影方向对应的直线应该使得各点到此直线的距离的平方和最小。关于这个目标和最大方差目标的等价性,我在 这里 已经说明过了。
从求解直线的思路出发,很容易联想到数学中的线性回归问题,其目标也是求解一个线性函数使得对应直线能够更好地拟合样本点集合。如果我们从这个角度定义PCA的目标,那么问题就会转化为一个回归问题。
数据集中每个点 到 维超平面 的距离为:
其中 表示 在超平面 上的投影向量。若该超平面 由 个标准正交基 构成,则有线代知识可知, 可由这组基线性表示:
其中 表示 在 方向上投影的长度。因此 实际上就是 在 这组标准正交基下的坐标。而PCA要优化的目标是:
将上式中每个距离展开:
可以看到,第一项与选取的 无关,是一个常数,将 代入第二项第三项得到:
因为当 时, ,因此上式可写为:
于是:
这等价于求解带约束的优化问题:
如果我们对 中的 个基 依次求解,就会发现 和最大方差理论的方法完全等价 。
线性判别分析(Linear Discriminant Analysis, LDA)是一种 有监督学习算法 ,同时经常被用来对数据进行降维。
相比于PCA,LDA可以作为一种有监督的降维算法。在PCA中没有考虑数据的标签(类别),只是把原数据映射到一些方差比较大的方向上而已。
假设用不同的颜色标注 两个不同类别的数据,如图所示。根据PCA算法,数据应该映射到方差最大的那个方向,亦即 轴方向。但是, 两个不同类别的数据就会完全混合在一起,很难区分开。所以,使用PCA算法进行降维后再进行分类的效果会非常差。但是如果使用LDA算法,数据会映射到 轴方向。
1、要想降维过程中不损失类别信息,一个简单的想法就是降维后两类样本点之间的距离越远越好,这样才能将两类样本区分开来。
2、在这样的目标下,假设样本在目标超平面上的投影,并考察两类样本投影的均值点,求解一个超平面,使得这两个均值点之间的距离最大。
LDA首先是为了分类服务的,因此只要找到一个投影方向 ,使得投影后的样本尽可能按照原始类别分开 。 我仍不妨从一个简单的二分类问题出发,有 两个类别的样本,两类的均值分别为 ,我们希望投影之后两类之间的距离尽可能大,距离表示为:
和 表示两类中心在 方向上的投影向量,即 ,因此需要优化的问题为:
容易发现当 方向与 一致的时候,该距离达到最大值,例如对图(a)的黄棕两种类别的样本点进行降维时, 若按照最大化两类投影中心距离的准则,会将样本点投影到下方的黑线上。但是原本可以被线性划分的两类样本经过投影后有了一定程度的重叠,这显然不能使我们满意。我们希望得到的投影结果如图(b)所示,虽然两类的中心在投影之后的距离有所减小,但确使投影之后样本的可区分性提高了。
仔细观察两种投影方式的区别,可以发现,在图(b)中,投影后的样本点似乎在每一类中分布得更为集中了,用数学化的语言描述就是每类内部的方差比(a)中更小。这就引出了 LDA的中心思想一一最大化类间距离和最小化类内距离 。
在前文中我们已经找到了使得类间距离尽可能大的投影方式,现在只需要同时优化类内方差,使其尽可能小。我们将整个数据集的类内方差定义为各个类分别的方差之和,将目标函数定义为类间距离和类内距离的比值,于是引出我们需要最大化的目标:
真中 为单位向量, 分别表示两类投影后的方差:
因此 可以写成:
定义类间散度矩阵为:
类内散度矩阵为:
则有:
我们要最大化 ,只需对 求偏导,并令导数等于零:
于是得出:
在二分类中 和 是两个数,令 ,于是:
即:
从这里我们可以看出,我们最大化的目标对应了一个矩阵的特征值。 于是LDA降维变成了一个求矩阵特征向量的问题。 就对应矩阵 最大的特征值,而投影方向就是这个特征值对应的特征向量 。
对于二分类这一问题,由于 ,因此 的方向始终与 一致,若只考虑 的方向而不考虑长度,可得 。
1、LDA和PCA最显著的区别就是前者是有监督方法而后者是无监督方法,因此在应用中,对于数据中有标签的应该使用LDA,对于数据中无标签的则使用PCA。
2、数学推导上,两者的区别在于,PCA并未考虑类之间的距离(因为PCA并未用到标签信息),而是仅仅考虑了降维后数据的方差,从这个角度来说,PCA相当于在LDA中将所有数据当成一类去处理的特殊情形。因此我们可以看到两者的数学推导也十分相似,最终目标都归为求解一个矩阵的特征值分解。
首先将LDA拓展到多类高维的情况以和问题PCA的求解对应。假设有 个类别,并需要最终将特征降维至 维。我们要找到一个 维投影超平面 使得投影后的样本点满足LDA的目标一一最大化类间距菌和最小化类内距离。
回顾两个散度矩阵,类内散度矩阵 在类别数增加时仍满足定义。而之前两类问题的类间散度矩阵 在类别增加后就无法按照原始定义。
考虑三类样本的情况, 分别表示棕绿黄三类样本的中心, 表示这三个中心的均值(也即全部样本的中心), 表示第 类的类内散度。我们可以定义一个新的矩阵 表示全局整体的散度,称为全局散度矩阵:
如果把全局散度定义为类内散度与类间散度之和,即 ,那么类间散度矩阵可表示为:
其中 是第 个类别中的样本个数, 是总的类别个数。根据LDA的原理,可以将最大化的目标定义为:
剩下的求解过程与之前二分类LDA相同。
至此我们得到了与PCA步骤类似,但具有多个类别标签高维数据的LDA求解方法:
1)计算数据集中每个类别样本的均值向量 ,及总体均值向量 。
2)计算类内散度矩阵 和全局散度矩阵 ,得到类间散度矩阵 。
3)对矩阵 进行特征值分解,将特征值从大到小排列。
4)取特征值前 大的特征值对应的特征向量 ,通过以下映
射将 维样本映射到 维:
从PCA和LDA两种降维方法的求解过程来看,它们确实有着很大的相似性,但对应的原理却有所区别。首先从目标出发, PCA选择的是投影后数据方差最大的方向。由于它是无监督的,因此PCA假设方差越大,信息量越多,用主成分来表示原始数据可以去除冗余的维度,达到降维。而LDA选择的是投影后类内方差小、类间方差大的方向,其用到了类别标签信息。为了找到数据中具有判别性的维度,使得原始数据在这些方向上投影后,不同类别尽可能区分开 。
举一个简单的例子,在语音识别中,我们想从一段音频中提取出人的语音信号,这时可以使用PCA先进行降维,过滤掉一些固定频率(方差较小)的背景噪声。但如果我们的需求是从这段音频中区分出声音属于哪个人,那么我们应该使用LDA对数据进行降维,使每个人的语音信号具有区分性。
从应用的角度,我们可以掌握一个基本的原则一一 对无监督的任务使用PCA进行降维,对有监督的则应用LDA 。
重构前四章 不求甚解
不求甚解 之重构前四章
在这篇blog中,我将记录和描述我阅读计算机软件行业经典书籍《重构》过程中的思路和阅读后的总结。整体而言,阅读《重构》是一个美好的过程,但是,可能个人期望过高,导致我觉得这本书有些盛名之下其实难副。下面的文章中,将从三个角度进行描述,分别是
- 《重构》讲的是什么
- 为什么要读这本书
- 如何阅读这本书
《重构》讲的是什么
核心思想
在我们编写大型项目的过程中,由于市场压力,deadline的存在,作为程序员经常听到的一句话是:我不在乎你是怎么弄的,告诉我什么时候可以搞定。作为boss和市场侧,这句话是完全没有问题的。但是,作为一个程序员,这样的语言很可能造成一个恶性循环,我们不妨称之为”老板循环“。紧张的时间,导致架构设计和测试设计不足,从而导致虽然前期功能实现快,但项目和产品质量欠佳。而到了项目的后期,项目进度和产品质量都成了项目瓶颈。新功能难以加入到现有的架构。加入的新功能测试不足,导致大量的时间和人力投入到了debug中。《重构》这本书,则是通过简单的例子,向我们一步步的展示,如何可以跳出这样的”老板循环“。
当”老板循环“出现的时候,所有的人都会十分痛苦。对底层程序员来说,功能难以完善,项目质量差,debug时间多而无聊。对PM来说,项目进度和功能要求与程序员的工作时间成了严重的冲突方,程序员十分痛苦,但是项目进度严重落后,新功能无法交付客户。对老板和客户来说,项目进度差和项目质量糟糕,会逐渐消磨投资人与客户的耐心,从而转向其他团队或者公司的产品。
可能有人说了,既然这么痛苦,我们是不是应该重新设计,重构我们的项目,从根本上解决我们的问题?答案似乎是显而易见的,我们需要”重构“。可是,摆在我们面前的问题是,老板、投资人、客户的deadline不会向后延期,毕竟,他们可不管程序员们具体是怎么解决问题的。针对这样的问题,作者提出来的思路是:
- 当出现加入新功能困难时,不妨开始进行重构
- 重构可以从非常小的函数着手,逐步进行
- 尝试构建测试系统,保障重构的正确性
- 任何改动,严格遵循改动,编译,测试,提交的工作流
行文架构
《重构》的行文架构较为程序员化。整个第一章节,作者举了一个戏剧团收入计算的程序作为例子,向我们一步步展示了如何将一个长函数进行抽象拆分,最后变成互相独立的模块,从而友好的增加一个新功能的过程。在读的过程中,我们完全可以跟着作者的思路同时进行编码和修改。这个例子基本展示出了作者的思路。第二章中,承接第一章,作者介绍了重构的原则,包括了什么是重构,为什么重构,如何进行重构等。第三章节中,作者展开描述了什么时候需要重构这个问题,非常具体的说明了很多”代码中的坏味道“。第四章节中,则是阐述了我们测试的价值以及如何进行测试。后续章节则是逐个说明了如何进行重构。
在我看来,阅读了前四章节就能明白作者的核心思想,了解什么是重构,什么时候需要重构,当我们真正开始重构的时候,完全可以像查字典一样,参考后续的重构手法。
为什么需要读这本书
我如何得知这本书
如同文本中”核心思想“那部分的描述,我也是”老板循环“中的一员。在团队中,我体验过的角色包括了:普通开发者,模块负责人,项目经理(PM)。当我是一名开发人员的时候,我每天都在de不是我写的bug。无穷无尽的bug掩埋住了我,以至于对coding产生了负面的厌恶情绪。当我是一个模块负责人,我仍然没能逃离循环,大部分时间我在尝试进行bug的预定位,之后分配给小组的成员。这样的过程持续时间长了,慢慢的对技术角色都产生了厌恶。而当我逃离技术岗位,成了一名年轻的项目经理,我发现,我仍然在循环中,只不过换了一个角色。每天都生活在程序员说的不可能和老板说的必须之间。项目进度落后同时质量欠佳。所以,我渐渐开始思考问题到底出在了哪里。从搜索引擎和博客中,我发现了《重构》这本经典书籍。虽然不能说这本书让我跳出了循环,但我至少学到了一些基础知识点,在以后如果我再回到技术岗位,我觉得我可以试试能不能跳出循环。从一个更高的角度去解决困扰的问题。
从书里,我学到了什么
具体来说,我从书籍中学到的关键点包括:
- 重构是一个循序渐进,让系统在可用的状态下,不断改良的过程。让系统处于不可用状态的改写,不叫重构。
- 重构技术是一个对架构的补充和修改,通过重构,新功能可以更好的被添加到已有系统中,系统也能变得更为稳定。
- 重构也需要遵循一定的方法:抽象、编译、测试、提交。四大步骤缺一不可。如果项目中没有测试系统,不妨开始构建它。
- 重构的过程中,要保障各种其他细节,类似分支、数据库等等。
如何阅读这本书
作者的行文思路非常的清晰,甚至有些公式化。无论是大的文章,还是小的章节,基本都遵循:举例,是什么,为什么,怎么做的四段轮逻辑。只需要按照作者的思路,逐段阅读即可。当然了,针对代码示例,自己照着来一遍肯定效果更佳。
以上是关于葫芦书第四章——降维的主要内容,如果未能解决你的问题,请参考以下文章