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
本文分享自 机器学习算法与Python学习 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!