前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自动编码器优化之主成分分析

自动编码器优化之主成分分析

作者头像
昱良
发布2018-04-08 14:40:03
9470
发布2018-04-08 14:40:03
举报
文章被收录于专栏:机器学习算法与Python学习

Contents

1 引言

2 实例和数学背景

3 旋转数据

4 数据降维

5 还原近似数据

6 选择主成分个数

1. 引言

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

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

2. 实例和数学背景

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

这些数据已经进行了预处理,使得每个特征 x[1] 和 x[2] 具有相同的均值(零)和方差。为方便展示,根据 x[1] 值的大小,我们将每个点分别涂上了三种颜色之一,但该颜色并不用于算法而仅用于图解。

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

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

假设 x 的均值为零,那么 ∑ 就是x的协方差矩阵。可以证明,数据变化的主方向 u[1] 就是协方差矩阵 ∑ 的主特征向量,而 u[2] 是次特征向量。

3. 旋转数据

至此,我们可以把 x 用 (u[1], u[2]) 基表达为:

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

对数据集中的每个样本 i 分别进行旋转:

然后把变换后的数据 x[rot] 显示在坐标图上,如下图所示。

这就是把训练数据集旋转到 u[1], u[2] 基后的结果。

4. 数据降维

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

更一般的,假如想把数据 x →R[^256] 降到 k 维表示,只需选取 x[rot] 的前 k 个成分,分别对应前 k 个数据变化的主方向。

PCA的另外一种解释是: x[rot] 是一个 n 维向量,其中前几个成分可能比较大,而后面成分可能会比较小。PCA算法做的其实就是丢弃 x[rot] 中后面取值较小的成分,就是将这些成分的值近似为零。具体的说,设 x_bar 是 x[rot] 的近似表示,那么将 x[rot] 除了前 k 个成分外,其余全赋值为零,就得到:

在本例中,可得 x_bar 的点图如下(取 n=2, k=2 ):

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

5. 还原近似数据

现在,我们得到了原始数据 x →R[^n] 的低维“压缩”表征量 x_bar→R[^k] ,反过来,如果给定 x_bar,我们应如何还原原始数据 x 呢?进一步,我们把 x_bar 看作将 x[rot] 的最后 n-k 个元素被置0所得的近似表示,因此如果给定 x_bar→R[^k],可以通过在其末尾添加 n-k 个0来得到对 x[rot] →R[^n] 的近似,最后,左乘 U 便可近似还原出原数据 。具体来说,计算如下:

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

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

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

6. 选择主成分的个数

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

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

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

在上面简单的二维实验中,λ[1] =7.29,λ[1]=0.69 。因此,如果保留 k=1 个主成分,等于我们保留

了 7.29/(7.29+0.69) =0.931 ,即91.3%的方差。

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

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

参考文献:http://cs229.stanford.edu

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-01-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习算法与Python学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档