最近学到了PCA,看到了斯坦福大学的教程,特翻译了一下,并加上了一些自己的理解。
主成分分析(PCA)是用来提升无监督特征学习速度的数据降维算法。
假设你正在训练图像,因为图像中相邻图片的元素具有很高的相关性,所以数据是冗余的。假设输入是16x16的灰度图片,则
例子和数学背景
我们使用
这里的对数据降维指的是降低数据的维度,而不是减少数据的数目。
在上图中数据已经经过归一化处理,特征值
通过上图点的可视化,可以发现,
也就是说,数据在
方差是同一类或者说同一维数据的离散性,而协方差则是不同维度数据的相关性,协方差为0说明二者独立不相关,为负就是负相关,为正就是正相关)。协方差的公式为:
可以证明数据变化的主方向
您可以使用标准的数值线性代数软件来查找这些特征向量(参见实现说明)。具体来说,让我们计算
在上面,
矩阵特征向量表达式:
。
我们可以近似利用向量
对协方差矩阵求特征分解求出特征向量也可以用奇异值分解(SVD)来求解,SVD求解出的U即为协方差矩阵的特征向量。U是变换矩阵或投影矩阵,即为上面说的坐标方向,U的每一列就是一个投影方向。另外具体参考内积的几何意义。
旋转数据
我们将
对整个训练样本转换,即对于每一个
这是训练集在
因为
数据降维
我们可以看到,数据变化的主要方向是第一维,即这个旋转的数据中的
更一般情况下,如果
另外一种PCA的解释为
在我们的例子中,
上面的
这也解释了为什么我们要在
数据的复原
现在
上面
是列向量。
上面的
右乘
相当于对 中各列进行线性组合,系数为 中各个值。
对于我们的数据,
因此,我们可以使用一维去近似我们的原始数据。
如果你正在训练自动编码器或其他无监督的特征学习算法,你的算法的运行时间将取决于输入的维数。如果使用
保留的元素个数
我们如何决定
为了决定如何设置
更普遍,
如果保留
在上面的例子中,
对于图像,一种常见的启发式方法是选择
根据应用程序的不同,如果您愿意容忍一些额外的错误,有时也会使用90-98%范围内的值。当你向其他人描述如何应用PCA时,说选择
图像上的PCA
要使PCA正常工作,通常需要每个特性
在对自然图像进行训练时,估计每个像素的单独均值和方差没有多大意义,因为图像一部分的统计数据(理论上)应该与其他任何部分相同。
图像的这种性质称为“平稳性”。
具体而言,为了使PCA更好地工作,我们非正式地要求:(i)各特征的均值近似为零;(ii)不同特征之间具有类似的方差。对于自然图像,即使没有方差归一化,(ii)也已经满足,因此我们将不进行任何方差归一化。(如果使用音频数据(例如,光谱图)或文本数据(例如,字包向量)等进行训练,我们通常也不会进行方差归一化。)
事实上,PCA对数据的缩放是不变的,并且无论输入的缩放大小如何,它都会返回相同的特征向量。更正式地说,如果将每个特征向量
所以,我们不会使用方差规划化,只需对均值进行规范化,确保每一个特征都是零均值。在应用中,我们经常对图像的亮度不感兴趣。例如,在物体回归问题中,图像的总体亮度不会影像物体的位置。更正式,我们对一个图像块的平均强度值不感兴趣。因此我们可以减去这个值,这是归一化的一种形式。
具体的,如果
注意对于每个图像
如果你正在对自然图像以外的图像(例如手写字符的图像或以白色背景为中心的单个孤立对象的图像)进行算法训练,则其他类型的规范化可能值得考虑,而最佳选择可能取决于应用场景。但是,在自然图像训练中,使用上述公式中给出的每幅图像的均值归一化方法将是一个合理的缺省值。
白化
我们使用PCA降低数据的维数。有一个密切相关的预处理步骤叫白化(也称为球化)。如果我们对图像进行训练,原始输入是有多余的项,因为相邻的像素值高度相关。白化的目标是减少输入的冗余;更正式地说,期望我们的学习算法得到一个训练输入,满足(i)特征之间的相关性较小,(ii)所有特征都具有相同的方差。
二维的例子
我们首先使用之前的2D例子描述白化。然后我们将描述如何将平滑与其相结合,以及如何将PCA与其相结合。
如何使得输入特征之间互相不相关呢?我们计算
???这个数据的协方差矩阵为:
(注:从技术上讲,本节中关于“协方差”的许多陈述只有在数据均值为零的情况下才是正确的。在本节的其余部分,我们将把这一假设视为隐含在我们的声明中。然而,即使数据的均值不完全为零,我们这里给出的直觉仍然成立,因此这不是你应该担心的事情。)
对角元素为
为了使我们的每个输入特性具有单位方差,我们可以每个特征
画出
这个数据的方差现在等于单位阵
白化与降维相结合。如果你希望数据被白化,并且比原始输入的维数更低,那么您还可以选择只保留
ZCA白化
最后,事实证明这种让数据具有协方差恒等式
在ZCA白化中,我们选择
我们画出来
可以看出,在
当使用ZCA白化的时候(不同于PCA白化),我们通常保留数据所有的维度,不会降低维度。
正则化
无论是PCA白化还是ZCA白化,有时一些特征值
当
对于图像,在这里添加
ZCA白化是将数据
PCA白化实现
在这一节中,我们总结了PCA、PCA白化和ZCA白化算法,并描述了如何使用有效的线性代数库来实现它们。
首先,我们需要确保数据具有(近似)零均值。
对于自然图像,我们(近似)通过减去每个图像块的平均值来实现这一点。我们通过减去每个图像块的平均值来实现这一点。在Matlab中,我们可以通过使用:
1 | avg = mean(x, 1); % Compute the mean pixel intensity value separately for each patch. |
接着,我们计算
1 | sigma = x * x' / size(x, 2); |
这里,
接着,PCA需要计算协方差eig
函数完成此操作。然而,由于svd
函数在数值上更可靠。
1 | [U,S,V] = svd(sigma); |
矩阵
注:svd函数实际上计算矩阵的奇异向量和奇异值,对于对称半正定矩阵的特殊情况,这就是我们在这里所关注的,等于它的特征向量和特征值。(对奇异向量与特征向量的全面讨论超出了本文的讨论范围。)
最后,计算
1 | xRot = U' * x; % rotated version of the data. |
这将给出
顺便说一句,如果
计算PCA白化
1 | xPCAwhite = diag(1./sqrt(diag(S) + epsilon)) * U' * x; |
最后,你也可以计算ZCA白化数据
1 | xZCAwhite = U * diag(1./sqrt(diag(S) + epsilon)) * U' * x; |
Related Issues not found
Please contact @zdaiot to initialize the comment