机器学习中的数学(九):主成分分析(PCA)

引言

主成分分析(PCA)是一种能够极大提升无监督特征学习速度的数据降维算法。更重要的是,理解 PCA 算法,对实现白化算法有很大的帮助,很多算法都先用白化算法作预处理步骤。假设你使用图像来训练算法,因为图像中相邻的像素高度相关,输入数据是有一定冗余的。具体来说,假如我们正在训练的 16x16 灰度值图像,记为一个 256维向量x\epsilon \Re ^{256} ,其中特征值x_{j}对应每个像素的亮度值。由于相邻像素间的相关性,PCA 算法可以将输入向量转换为一个维数低很多的近似向量,而且误差非常小。

引例

数学背景

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

这些数据已经进行了预处理,使得每个特征x1和x2具有相同的均值(零)和方差。为方便展示,根据x1值的大小,我们将每个点分别涂上了三种颜色之一,但该颜色并不用于算法而仅用于图解。
PCA 算法将寻找一个低维空间来投影我们的数据。从下图中可以看出,u1是数据变化的主方向,而u2是次方向。

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

假设x的均值为零,那么\Sigma就是 x 的协方差矩阵。

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

此处u1是主特征向量(对应最大的特征值),u2是次特征向量;\lambda _{1},\cdots ,\lambda _{n}为相应的特征值。 在本例中,向量u1和u2构成了一个新基,可以用来表示数据。令x\epsilon \Re ^{2}为训练样本,那么u_{1}^{T}x就是样本点x在维度u1上的投影的长度(幅值)。同样的,u_{2}^{T}x是x投影到u2维度上的幅值。

旋转数据

我们可以把 x用(u1,u2)基表达为:

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

对数据集中的每个样本x^{(i)}分别进行旋转: ,然后把变换后的数据x_{rot}显示在坐标图上,可得:

这就是把训练数据集旋转到 u1,u2基后的结果。一般而言,U^{T}x运算 表示旋
转 到 基u_{1},\cdots ,u_{n} 之 上 的 训练数据 。矩阵U有正交性,即满足 ,所以若想将旋转后的向量x_{rot}还原为原始数据x,将其左乘矩阵U即可: , 验算一下: .

数据降维

数据的主方向就是旋转数据的第一维x_{rot,1}。因此,若想把这数据降到一维,可令:
更一般的,假如想把数据x\epsilon \Re ^{n}降到维表示 (令 ),只需选取x_{rot}的前k个成分,分别对应前k个数据变化的主方向。
PCA 的另外一种解释是:x_{rot}是一个n维向量,其中前几个成分可能比较大(例如,上例中大部分样本第一个成分的取值相对较大),而后面成分可能会比较小(例如,上例中大部分样本的较小)。

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

在本例中,可得\widetilde{x}的点图如下(取n=2.k=1 ):

然而,由于上面\widetilde{x}的后n-k项均为零,没必要把这些零项保留下来。所以,我
们仅用前k个(非零)成分来定义k维向量\widetilde{x}
这也解释了我们为什么会以u_{1},\cdots ,u_{n}为基来表示数据:要决定保留哪些
成分变得很简单,只需取前k个成分即可。这时也可以说,我们“保留了前k个
PCA(主)成分”。

还原近似数据

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

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

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

选择主成分个数

我们该如何选择k,即保留多少个 PCA 主成分?在上面这个简单的二维实验中,保留第一个成分看起来是自然的选择。对于高维数据来说,做这个决定就没那么简单:如果k过大,数据压缩率不高,在极限情况k=n时,等于是在使用原始数据(只是旋转投射到了不同的基);相反地,如果k过小,那数据的近似误差太太。
决定k值时,我们通常会考虑不同k值可保留的方差百分比。具体来说,如果k=n,那么我们得到的是对数据的完美近似,也就是保留了 100%的方差,即原始数据的所有变化都被保留下来;相反,如果k=0,那等于是使用零向量来逼近输入数据,也就是只有 0%的方差被保留下来。
一般而言,设\lambda _{1},\cdots ,\lambda _{n}表示\Sigma的特征值(按由大到小顺序排列),使得\lambda _{j}为对应于特征向量u_{j}的特征值。那么如果我们保留前k个成分,则保留的方差百分比可计算为:

在上面简单的二维实验中,\lambda _{1}=7.29,\lambda _{2}=0.69, 。因此,如果保留k=1个主成分,等于我们保留了7.29/(7.29+0.69),即 91.3%的方差。对保留方差的百分比进行更正式的定义已超出了本教程的范围,但很容易证明,。因此,如果\lambda _{j}\approx 0,则说明x_{rot,j}也就基本上接近于 0,所以用 0 来近似它并不会产生多大损失。这也解释了为什么要保留前面的主成分(对应的\lambda _{j}值较大)而不是末尾的那些。这些前面的主成分x_{rot,j}变化性更大,取值也更大,如果将其设为 0 势必引入较大的近似误差。以处理图像数据为例,一个惯常的经验法则是选择 以保留 99%的方差,换句话说,我们选取满足以下条件的最小k值:

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

对图像数据应用 PCA 算法

为使 PCA 算法能有效工作,通常我们希望所有的特征x_{1},\cdots ,x_{n}都有相似的取值范围(并且均值接近于 0)。如果你曾在其它应用中使用过 PCA 算法,你可能知道有必要单独对每个特征做预处理,即通过估算每个特征x_{j}的均值和方差,而后将其取值范围规整化为零均值和单位方差。但是,对于大部分图像类型,我们却不需要进行这样的预处理。假定我们将在自然图像上训练算法,此时特征x_{j}代表的是像素j的值。所谓“自然图像”,不严格的说,是指人或动物在他们一生中所见的那种图像。注:通常我们选取含草木等内容的户外场景图片,然后从中随机截取小图像块(如16x16 像素)来训练算法。在实践中我们发现,大多数特征学习算法对训练图片的确切类型并不敏感,所以大多数用普通照相机拍摄的图片,只要不是特别的模糊或带有非常奇怪的人工痕迹,都可以使用。

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

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

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

具体的步骤是,如果x^{(i)}\epsilon \Re ^{n}代表 16x16 的图像块的亮度(灰度)值(n=256 ),可用如下算法来对每幅图像进行零均值化操作:

for all j

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

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值