PCA(主成分分析)

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

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

数据降维

数据的主方向就是旋转数据的第一维 \textstyle x_{{\rm rot},1} 。因此,若想把这数据降到一维,可令:

\begin{align}
\tilde{x}^{(i)} = x_{{\rm rot},1}^{(i)} = u_1^Tx^{(i)} \in \Re.
\end{align}

更一般的,假如想把数据 \textstyle x \in \Re^n 降到 \textstyle k 维表示 \textstyle \tilde{x} \in \Re^k (令 \textstyle k < n ),只需选取 \textstyle x_{\rm rot} 的前 \textstyle k 个成分,分别对应前 \textstyle k 个数据变化的主方向。

PCA的另外一种解释是:\textstyle x_{\rm rot} 是一个 \textstyle n 维向量,其中前几个成分可能比较大(例如,上例中大部分样本第一个成分 \textstyle x_{{\rm rot},1}^{(i)} = u_1^Tx^{(i)} 的取值相对较大),而后面成分可能会比较小(例如,上例中大部分样本的 \textstyle x_{{\rm rot},2}^{(i)} = u_2^Tx^{(i)} 较小)。

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

\begin{align}
\tilde{x} = 
\begin{bmatrix} 
x_{{\rm rot},1} \\
\vdots \\ 
x_{{\rm rot},k} \\
0 \\ 
\vdots \\ 
0 \\ 
\end{bmatrix}
\approx 
\begin{bmatrix} 
x_{{\rm rot},1} \\
\vdots \\ 
x_{{\rm rot},k} \\
x_{{\rm rot},k+1} \\
\vdots \\ 
x_{{\rm rot},n} 
\end{bmatrix}
= x_{\rm rot} 
\end{align}

选择主成分个数

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

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

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

\begin{align}
\frac{\sum_{j=1}^k \lambda_j}{\sum_{j=1}^n \lambda_j}.
\end{align}

在上面简单的二维实验中,\textstyle \lambda_1 = 7.29\textstyle \lambda_2 = 0.69 。因此,如果保留 \textstyle k=1 个主成分,等于我们保留了 \textstyle 7.29/(7.29+0.69) = 0.913 ,即91.3%的方差。

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

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

\begin{align}
\frac{\sum_{j=1}^k \lambda_j}{\sum_{j=1}^n \lambda_j} \geq 0.99. 
\end{align}

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

对图像数据应用PCA算法

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

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

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

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

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

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

\mu^{(i)} := \frac{1}{n} \sum_{j=1}^n x^{(i)}_j

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

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

ref: http://deeplearning.stanford.edu/wiki/index.php/UFLDL_Tutorial

Share this to:

发表评论

电子邮件地址不会被公开。 必填项已用*标注