PCA主成分分析+白化

引言

主成分分析(PCA)是一种能够极大提升无监督特征学习速度的数据降维算法。更重要的是,理解PCA算法,对实现白化算法有很大的帮助,很多算法都先用白化算法作预处理步骤。

假设你使用图像来训练算法,因为图像中相邻的像素高度相关,输入数据是有一定冗余的。具体来说,假如我们正在训练的16x16灰度值图像,记为一个256维向量  ,其中特征值  对应每个像素的亮度值。由于相邻像素间的相关性,PCA算法可以将输入向量转换为一个维数低很多的近似向量,而且误差非常小。

实例和数学背景

在我们的实例中,使用的输入数据集表示为  ,维度  即  。假设我们想把数据从2维降到1维。(在实际应用中,我们也许需要把数据从256维降到50维;在这里使用低维数据,主要是为了更好地可视化算法的行为)。下图是我们的数据集:

这些数据已经进行了预处理,使得每个特征  和  具有相同的均值(零)和方差。

为方便展示,根据  值的大小,我们将每个点分别涂上了三种颜色之一,但该颜色并不用于算法而仅用于图解。

PCA算法将寻找一个低维空间来投影我们的数据。从下图中可以看出,  是数据变化的主方向,而  是次方向。

也就是说,数据在  方向上的变化要比在  方向上大。为更形式化地找出方向  和  ,我们首先计算出矩阵  ,如下所示:

假设  的均值为零,那么  就是x的协方差矩阵。(符号  ,读"Sigma",是协方差矩阵的标准符号。虽然看起来与求和符号  比较像,但它们其实是两个不同的概念。)

可以证明,数据变化的主方向  就是协方差矩阵  的主特征向量,而  是次特征向量。

注:如果你对如何得到这个结果的具体数学推导过程感兴趣,可以参看CS229(机器学习)PCA部分的课件(链接在本页底部)。但如果仅仅是想跟上本课,可以不必如此。

你可以通过标准的数值线性代数运算软件求得特征向量(见实现说明).我们先计算出协方差矩阵的特征向量,按列排放,而组成矩阵

此处,  是主特征向量(对应最大的特征值),  是次特征向量。以此类推,另记  为相应的特征值。

在本例中,向量  和  构成了一个新基,可以用来表示数据。令  为训练样本,那么  就是样本点  在维度  上的投影的长度(幅值)。同样的,  是  投影到  维度上的幅值。

旋转数据

至此,我们可以把  用  基表达为:

(下标“rot”来源于单词“rotation”,意指这是原数据经过旋转(也可以说成映射)后得到的结果)

对数据集中的每个样本  分别进行旋转:  for every  ,然后把变换后的数据  显示在坐标图上,可得:

这就是把训练数据集旋转到  基后的结果。一般而言,运算  表示旋转到基 ,, ..., 之上的训练数据。矩阵  有正交性,即满足  ,所以若想将旋转后的向量  还原为原始数据  ,将其左乘矩阵即可:  , 验算一下: .

数据降维

数据的主方向就是旋转数据的第一维  。因此,若想把这数据降到一维,可令:

更一般的,假如想把数据  降到  维表示  (令  ),只需选取  的前  个成分,分别对应前  个数据变化的主方向。

PCA的另外一种解释是: 是一个  维向量,其中前几个成分可能比较大(例如,上例中大部分样本第一个成分  的取值相对较大),而后面成分可能会比较小(例如,上例中大部分样本的  较小)。

PCA算法做的其实就是丢弃  中后面(取值较小)的成分,就是将这些成分的值近似为零。具体的说,设  是  的近似表示,那么将  除了前  个成分外,其余全赋值为零,就得到:

在本例中,可得  的点图如下(取  ):

然而,由于上面  的后项均为零,没必要把这些零项保留下来。所以,我们仅用前  个(非零)成分来定义  维向量  。

这也解释了我们为什么会以  为基来表示数据:要决定保留哪些成分变得很简单,只需取前  个成分即可。这时也可以说,我们“保留了前  个PCA(主)成分”。

还原近似数据

现在,我们得到了原始数据  的低维“压缩”表征量  , 反过来,如果给定  ,我们应如何还原原始数据  呢?查看以往章节以往章节可知,要转换回来,只需  即可。进一步,我们把  看作将  的最后  个元素被置0所得的近似表示,因此如果给定  ,可以通过在其末尾添加  个0来得到对  的近似,最后,左乘  便可近似还原出原数据  。具体来说,计算如下:

上面的等式基于先前对  的定义。在实现时,我们实际上并不先给  填0然后再左乘  ,因为这意味着大量的乘0运算。我们可用  来与  的前  列相乘,即上式中最右项,来达到同样的目的。将该算法应用于本例中的数据集,可得如下关于重构数据  的点图:

由图可见,我们得到的是对原始数据集的一维近似重构。

在训练自动编码器或其它无监督特征学习算法时,算法运行时间将依赖于输入数据的维数。若用  取代  作为输入数据,那么算法就可使用低维数据进行训练,运行速度将显著加快。对于很多数据集来说,低维表征量  是原数据集的极佳近似,因此在这些场合使用PCA是很合适的,它引入的近似误差的很小,却可显著地提高你算法的运行速度。

选择主成分个数

我们该如何选择  ,即保留多少个PCA主成分?在上面这个简单的二维实验中,保留第一个成分看起来是自然的选择。对于高维数据来说,做这个决定就没那么简单:如果  过大,数据压缩率不高,在极限情况  时,等于是在使用原始数据(只是旋转投射到了不同的基);相反地,如果  过小,那数据的近似误差太太。

决定  值时,我们通常会考虑不同  值可保留的方差百分比。具体来说,如果  ,那么我们得到的是对数据的完美近似,也就是保留了100%的方差,即原始数据的所有变化都被保留下来;相反,如果  ,那等于是使用零向量来逼近输入数据,也就是只有0%的方差被保留下来。

一般而言,设  表示  的特征值(按由大到小顺序排列),使得  为对应于特征向量  的特征值。那么如果我们保留前  个成分,则保留的方差百分比可计算为:

在上面简单的二维实验中, , 。因此,如果保留  个主成分,等于我们保留了  ,即91.3%的方差。

对保留方差的百分比进行更正式的定义已超出了本教程的范围,但很容易证明, 。因此,如果  ,则说明  也就基本上接近于0,所以用0来近似它并不会产生多大损失。这也解释了为什么要保留前面的主成分(对应的  值较大)而不是末尾的那些。 这些前面的主成分  变化性更大,取值也更大,如果将其设为0势必引入较大的近似误差。

以处理图像数据为例,一个惯常的经验法则是选择  以保留99%的方差,换句话说,我们选取满足以下条件的最小  值:

对其它应用,如不介意引入稍大的误差,有时也保留90-98%的方差范围。若向他人介绍PCA算法详情,告诉他们你选择的  保留了95%的方差,比告诉他们你保留了前120个(或任意某个数字)主成分更好理解。

对图像数据应用PCA算法

为使PCA算法能有效工作,通常我们希望所有的特征  都有相似的取值范围(并且均值接近于0)。如果你曾在其它应用中使用过PCA算法,你可能知道有必要单独对每个特征做预处理,即通过估算每个特征  的均值和方差,而后将其取值范围规整化为零均值和单位方差。但是,对于大部分图像类型,我们却不需要进行这样的预处理。假定我们将在自然图像上训练算法,此时特征  代表的是像素  的值。所谓“自然图像”,不严格的说,是指人或动物在他们一生中所见的那种图像。

注:通常我们选取含草木等内容的户外场景图片,然后从中随机截取小图像块(如16x16像素)来训练算法。在实践中我们发现,大多数特征学习算法对训练图片的确切类型并不敏感,所以大多数用普通照相机拍摄的图片,只要不是特别的模糊或带有非常奇怪的人工痕迹,都可以使用。

在自然图像上进行训练时,对每一个像素单独估计均值和方差意义不大,因为(理论上)图像任一部分的统计性质都应该和其它部分相同,图像的这种特性被称作平稳性(stationarity)。

具体而言,为使PCA算法正常工作,我们通常需要满足以下要求:(1)特征的均值大致为0;(2)不同特征的方差值彼此相似。对于自然图片,即使不进行方差归一化操作,条件(2)也自然满足,故而我们不再进行任何方差归一化操作(对音频数据,如声谱,或文本数据,如词袋向量,我们通常也不进行方差归一化)。实际上,PCA算法对输入数据具有缩放不变性,无论输入数据的值被如何放大(或缩小),返回的特征向量都不改变。更正式的说:如果将每个特征向量  都乘以某个正数(即所有特征量被放大或缩小相同的倍数),PCA的输出特征向量都将不会发生变化。

既然我们不做方差归一化,唯一还需进行的规整化操作就是均值规整化,其目的是保证所有特征的均值都在0附近。根据应用,在大多数情况下,我们并不关注所输入图像的整体明亮程度。比如在对象识别任务中,图像的整体明亮程度并不会影响图像中存在的是什么物体。更为正式地说,我们对图像块的平均亮度值不感兴趣,所以可以减去这个值来进行均值规整化。

具体的步骤是,如果  代表16x16的图像块的亮度(灰度)值(  ),可用如下算法来对每幅图像进行零均值化操作:

, for all 

请注意:1)对每个输入图像块  都要单独执行上面两个步骤,2)这里的  是指图像块  的平均亮度值。尤其需要注意的是,这和为每个像素  单独估算均值是两个完全不同的概念。

如果你处理的图像并非自然图像(比如,手写文字,或者白背景正中摆放单独物体),其他规整化操作就值得考虑了,而哪种做法最合适也取决于具体应用场合。但对自然图像而言,对每幅图像进行上述的零均值规整化,是默认而合理的处理。

介绍

我们已经了解了如何使用PCA降低数据维度。在一些算法中还需要一个与之相关的预处理步骤,这个预处理过程称为白化(一些文献中也叫sphering)。举例来说,假设训练数据是图像,由于图像中相邻像素之间具有很强的相关性,所以用于训练时输入是冗余的。白化的目的就是降低输入的冗余性;更正式的说,我们希望通过白化过程使得学习算法的输入具有如下性质:(i)特征之间相关性较低;(ii)所有特征具有相同的方差。

2D 的例子

下面我们先用前文的2D例子描述白化的主要思想,然后分别介绍如何将白化与平滑和PCA相结合。

如何消除输入特征之间的相关性? 在前文计算  时实际上已经消除了输入特征之间的相关性。得到的新特征  的分布如下图所示:

这个数据的协方差矩阵如下:

(注: 严格地讲, 这部分许多关于“协方差”的陈述仅当数据均值为0时成立。下文的论述都隐式地假定这一条件成立。不过即使数据均值不为0,下文的说法仍然成立,所以你无需担心这个。)

 协方差矩阵对角元素的值为  和  绝非偶然。并且非对角元素值为0; 因此,  和  是不相关的, 满足我们对白化结果的第一个要求 (特征间相关性降低)。

为了使每个输入特征具有单位方差,我们可以直接使用  作为缩放因子来缩放每个特征  。具体地,我们定义白化后的数据  如下:

绘制出  ,我们得到:

这些数据现在的协方差矩阵为单位矩阵  。我们说, 是数据经过PCA白化后的版本:  中不同的特征之间不相关并且具有单位方差。

白化与降维相结合。 如果你想要得到经过白化后的数据,并且比初始输入维数更低,可以仅保留  中前  个成分。当我们把PCA白化和正则化结合起来时(在稍后讨论), 中最后的少量成分将总是接近于0,因而舍弃这些成分不会带来很大的问题。

ZCA白化

最后要说明的是,使数据的协方差矩阵变为单位矩阵  的方式并不唯一。具体地,如果  是任意正交矩阵,即满足  (说它正交不太严格, 可以是旋转或反射矩阵), 那么  仍然具有单位协方差。在ZCA白化中,令  。我们定义ZCA白化的结果为:

绘制 ,得到:

可以证明,对所有可能的 ,这种旋转使得  尽可能地接近原始输入数据  。

当使用 ZCA白化时(不同于 PCA白化),我们通常保留数据的全部  个维度,不尝试去降低它的维数。

正则化

实践中需要实现PCA白化或ZCA白化时,有时一些特征值  在数值上接近于0,这样在缩放步骤时我们除以  将导致除以一个接近0的值;这可能使数据上溢 (赋为大数值)或造成数值不稳定。因而在实践中,我们使用少量的正则化实现这个缩放过程,即在取平方根和倒数之前给特征值加上一个很小的常数 

当  在区间  上时, 一般取值为 

对图像来说, 这里加上  ,对输入图像也有一些平滑(或低通滤波)的作用。这样处理还能消除在图像的像素信息获取过程中产生的噪声,改善学习到的特征(细节超出了本文的范围)。

ZCA 白化是一种数据预处理方法,它将数据从  映射到  。 事实证明这也是一种生物眼睛(视网膜)处理图像的粗糙模型。具体而言,当你的眼睛感知图像时,由于一幅图像中相邻的部分在亮度上十分相关,大多数临近的“像素”在眼中被感知为相近的值。因此,如果人眼需要分别传输每个像素值(通过视觉神经)到大脑中,会非常不划算。取而代之的是,视网膜进行一个与ZCA中相似的去相关操作 (这是由视网膜上的ON-型和OFF-型光感受器细胞将光信号转变为神经信号完成的)。由此得到对输入图像的更低冗余的表示,并将它传输到大脑。

时间: 2024-07-30 19:55:33

PCA主成分分析+白化的相关文章

【机器学习算法-python实现】PCA 主成分分析、降维

1.背景 PCA(Principal Component Analysis),PAC的作用主要是降低数据集的维度,然后挑选出主要的特征. PCA的主要思想是移动坐标轴,找到方差最大的方向上的特征值,什么叫方差最大的方向的特征值呢.就像下图中的曲线B,一样,它的覆盖范围最广. 基本步骤:(1)首先计算数据集的协方差矩阵 (2)计算协方差矩阵的特征值和特征向量 (3)保留最重要的n个特征 what is 协方差矩阵: 定义是变量向量减去均值向量,然后乘以变量向量减去均值向量的转置再求均值.例如x是变

机器学习之PCA主成分分析

前言            以下内容是个人学习之后的感悟,转载请注明出处~ 简介 在用统计分析方法研究多变量的课题时,变量个数太多就会增加课题的复杂性.人们自然希望变量个数较少而得到的 信息较多.在很多情形,变量之间是有一定的相关关系的,当两个变量之间有一定相关关系时,可以解释为这两个变量反 映此课题的信息有一定的重叠.主成分分析是对于原先提出的所有变量,将重复的变量(关系紧密的变量)删去多余,建立 尽可能少的新变量,使得这些新变量是两两不相关的,而且这些新变量在反映课题的信息方面尽可能保持原有

PCA主成分分析Python实现

作者:拾毅者 出处:http://blog.csdn.net/Dream_angel_Z/article/details/50760130 Github源代码:https://github.com/csuldw/MachineLearning/tree/master/PCA PCA(principle component analysis) .主成分分析,主要是用来减少数据集的维度,然后挑选出基本的特征.原理简单,实现也简单.关于原理公式的推导,本文不会涉及,你能够參考以下的參考文献,也能够去W

PCA(主成分分析)方法浅析

PCA(主成分分析)方法浅析 降维.数据压缩 找到数据中最重要的方向:方差最大的方向,也就是样本间差距最显著的方向 在与第一个正交的超平面上找最合适的第二个方向 PCA算法流程 上图第一步描述不正确,应该是去中心化,而不是中心化 具体来说,投影这一环节就是:将与特征值对应的k个特征向量分别作为行向量组成特征向量矩阵P 直接乘以特征变量就好.原来是二维数据,降维之后只有一维. 我们想保留几个维度的特征,就留下几个特征值和对应的特征向量. 原文地址:https://www.cnblogs.com/j

深度学习入门教程UFLDL学习实验笔记三:主成分分析PCA与白化whitening

主成分分析与白化是在做深度学习训练时最常见的两种预处理的方法,主成分分析是一种我们用的很多的降维的一种手段,通过PCA降维,我们能够有效的降低数据的维度,加快运算速度.而白化就是为了使得每个特征能有同样的方差,降低相邻像素的相关性. 主成分分析PCA PCA算法可以将输入向量转换为一个维数低很多的近似向量.我们在这里首先用2D的数据进行试验,其数据集可以在UFLDL网站的相应页面http://ufldl.stanford.edu/wiki/index.php/Exercise:PCA_in_2D

PCA主成分分析

原文地址链接 1. 问题 真实的训练数据总是存在各种各样的问题: 1. 比如拿到一个汽车的样本,里面既有以“千米/每小时”度量的最大速度特征,也有“英里/小时”的最大速度特征,显然这两个特征有一个多余. 2. 拿到一个数学系的本科生期末考试成绩单,里面有三列,一列是对数学的兴趣程度,一列是复习时间,还有一列是考试成绩.我们知道要学好数学,需要有浓厚的兴趣,所以第二项与第一项强相关,第三项和第二项也是强相关.那是不是可以合并第一项和第二项呢? 3. 拿到一个样本,特征非常多,而样例特别少,这样用回

OpenCV+Qt:基于PCA主成分分析的人脸识别例程

在模式识别领域中,PCA是一种常用的数据集降维手段,在此基础上,保留数据集中对方差贡献最大的特征从而进行模式分类.OpenCV中提供PCA的类,因此可以方便地使用PCA来进行人脸识别研究.在学习了网上的相关实现和代码,在以下开发平台跑通了代码:win8.1+OpenCV2.4.9+Qt5.3.2. 一.基本步骤 关于PCA的一些理论,可参照:http://blog.csdn.net/liyuefeilong/article/details/45126255 以下是实现PCA的基本思路: 1.把原

【主成分分析】PCA主成分分析原理详解

声明:本文是转载自他处,原文载于此:http://blog.csdn.net/zhongkelee/article/details/44064401 一.PCA简介 1. 相关背景 上完陈恩红老师的<机器学习与知识发现>和季海波老师的<矩阵代数>两门课之后,颇有体会.最近在做主成分分析和奇异值分解方面的项目,所以记录一下心得体会. 在许多领域的研究与应用中,往往需要对反映事物的多个变量进行大量的观测,收集大量数据以便进行分析寻找规律.多变量大样本无疑会为研究和应用提供了丰富的信息,

PCA(主成分分析)原理,步骤详解以及应用

主成分分析(PCA, Principal Component Analysis) 一个非监督的机器学习算法 主要用于数据的降维处理 通过降维,可以发现更便于人类理解的特征 其他应用:数据可视化,去噪等 主成分分析是尽可能地忠实再现原始重要信息的数据降维方法 原理推导: 如图,有一个二维的数据集,其特征分布于特征1和2两个方向 现在希望对数据进行降维处理,将数据压缩到一维,直观的我们可以想到将特征一或者特征二舍弃一个,可以得到这样的结果 ------- : 舍弃特征1之后 ------- : 舍弃