主成分分析(PCA)是现代数据分析的主要方法之一,它被广泛使用但其内在机制仍不为太多人理解。这篇文章的主旨就是厘清并解释其原理。这篇教程不仅能帮助建立起对 PCA 原理的直觉理解,还希望能够澄清其内在的数学原理。因此,这是一篇同时用通俗语言与数学语言解释 PCA 的教程。希望不同层次的读者,都能通过本文获得对 PCA 的原理和应用更好的理解。
1. 概述
主成分分析(PCA)曾被称为应用线性代数领域中最有价值的结论。PCA 被广泛应用于多种形式的分析中,从神经科学到计算机视觉,因为它是一个足够简单的非参数方法,并能够从复杂的数据集中提取出最相关的信息。PCA 方法本身,可以再无需其他处理的情况下,将一个复杂数据集降至更低维度,以揭示其潜在的单纯的规律。
下面我们先从一个简单的例子开始,从直觉上解释下 PCA 的目的。
2. 一个简单的例子
假设我们现在是一名实验员,需要通过实验观测的数据,发现系统中的一些现象。实验的形式如下图示(Figure 1),一个无质量无摩擦的振动的弹簧。
我们的观测方式,是在弹簧周围放置了三个摄影机 a,b,c。学过物理的同学都知道,假设弹簧振动的轴是 x 的话,那么弹簧的振动公式一定可以由 x 以及时间 t 的组合表示出来。换句话说,系统潜在的规律可以由一个单变量 x 表达。那么,现在的问题在于,我们如何将摄影机 a,b,c 得到的数据,转换成 x 的表达式呢?
之所以面临这个问题,是因为 a,b,c 三个摄影机并不一定是按三位空间的 x,y,z 轴排列的,可能是任何的轴,三个摄影机也不一定是 90 度的夹角。并且在真实的实验数据中,我们还会遇到“噪音”(noise),使得得到的数据集并不完美。因此我们需要想办法解决这些问题,通过主成分分析的方法最终得到 x。
3. 基变换
主成分分析通过找到最优的基(basis)来重新表达一个有噪音的不完美的数据集。这些新的基可以过滤噪音,并揭示一些潜在的规律。在我们的例子中,我们希望通过 PCA 来揭示:x 轴的基才是表达系统最重要的维度。
3.1 一个朴素的基
对于一个数据集来说,测量(measurement)类型的数目,通常微微数据集的维度。在我们的例子里,每个摄像机提供一个 2 维的图像,因此一共有 6 个维度。通常来讲,每个数据点(data sample)都是一个 m 维的向量,m 就是整个数据集的维度。每个数据点代表的向量都存在于一个 m 维的向量空间中,而每个向量都是由一组单位长度的正交规范(orthonormal)的基向量的线性变换而成。比如一个最简单朴素的基就是单位矩阵:
的每一行就是一个基向量。
回到我们的例子,每个数据点可以表示成下面这样:
其中每个值其实都是中基的系数。
3.2 基变换
PCA 中进行所谓基变换的目的,主要在于找到一组更好的基,能够由原本的基通过线性变换表示出来。
上面一句话中有一个需要注意的词:线性(linear)。这其实是 PCA 的一个重要的假设,它极大地简化了问题,具体地讲:(1)线性的假设限制了可能的基的数量;(2)迎合了数据集连续性(continuity)的假设。
注:复杂的系统通常都是非线性的,并且他们最显著的特征通常更是系统非线性的产物。但局部的线性近似通常已经是足够好的近似。
现在我们有了 PCA 只是利用对基向量的线性组合,来重新表达数据集的假设后,可以进一步添加一些数学说明。假设和是 的矩阵,并可通过矩阵变换得到。作为原始数据集,作为重新表达后的数据集。
式 1:
同时再做以下的定义:
- 是的行(row);
- 是的列(column);
- 是的列(column)。
式(1)代表的就是基变换。可以理解为:矩阵通过空间旋转和拉伸的方式,转换到。或也可以理解为:的行向量,是表达的新的基向量。后一种表达方式可以展开为:
这种表达方式,可以进一步理解为:是在新基上的投影。
3.3 仍待解决的问题
前面通过假设“线性”,我们将问题归纳为了 找到合适的“基变换”。上面提到的其实就是我们要找的的主成分。那么剩下的问题就是如何找到?以及我们想让呈现什么样的特性?要回答这些问题,我们需要作出“线性”之外的更多的假设。
4. 引入方差
之前我们讲到了数据集可能存在噪声,事实上在一个线性的系统里,最大的两个问题中,一个是噪声,另一个是冗余(redundancy)。
4.1 噪声
低噪声是任何数据分析的前提。噪声没有一个通用的测量标准,通常可以用信噪比(SNR)来表示数据的噪声大小。
加入我们将某一个摄像机得到的数据可视化,多半会是如下图样,其中噪音的存在导致了分布的“椭圆”形,如果是毫无噪音的数据集,将会是一条直线。
4.2 冗余性
冗余性比较不大好处理,在我们弹簧的例子中,如果摄像机设置的不合理就会造成很大的冗余。下图是冗余性的分布示例:
在最右的分布里,可以看出两个特征是完全相关(correlated)的,因此存在极大的冗余性,而最左边的分布中,两个特征完全没有可辨别的相关性,则完全不存在冗余。
在实际数据集中,冗余通常表现在比如 A、B 两个特征都是某个长度,只是由不同单位表示;或两个特征都体现用户的购买力等等。这种情况下,都需要通过 feature engineering 减少特征的数量。
4.3 协方差矩阵
从上一节可以看到,SNR 完全是由方差计算 得到的。一个简单的得到数据集冗余成都的方式,就是计算整个数据集的“方差”,也就是协方差。
假设有两个特征 A 和 B:
那么 A 和 B 的协方差就是 :
注:$<·>{i}i$为索引的平均值。_
- 如果,那么 A 与 B 则完全不相关;
- 如果,那么 A 与 B 完全一致。
接下来可以假设一个数据集,以矩阵的形式表现。那么下面的式子就很值得探讨了:
这个表达式非常有意思,仔细想一想就会发现,它的第个元素,就是的第个特征与第个特征的点积(dot product)。而这个的矩阵,其对角线上的元素,是每个特征的方差,而非对角线的元素,是每两个特征的协方差。因此也称为“协方差矩阵”。
承接之前的结论,要消除数据集的冗余,需要特征间的协方差尽可能小。因此,理想的协方差矩阵会是一个对角矩阵(diagonal matrix),也就是除了对角线上的元素其他都是 0 的矩阵。所以 PCA 要做的事情就是对角化(diagonalize)。
4.4 对角化
对角化有很多种实现方式,其中 PCA 选择的可能是最简单的方式。还记得我们把基变换中的新基命名为吗,PCA 假设首先是正交规范的,其次,PCA 假设使方差最大的轴,就是最重要的轴。为什么说这两个假设使得对角化简单呢,我们可以具象一下 PCA 的工作原理。
PCA 首先会在维的空间里选择一个方向(或者说轴)使得的方差最大;然后根据正交规范的假设,PCA 只会在于第一个方向正交规范的情况下,选择第二个方向使得方差最大。然后一直重复直到个方向都被选出来了。这样的好处是使得整个解法都是可用线性代数的。
5. 解法 1:协方差的特征向量
这个解法是基于“特征向量分解”的。假设数据集是,是一个的矩阵。其中是特征数量,是数据集大小。目标如下:
找到一个正交规范的矩阵,使得是对角化的,其中。而的行就是的主成分(principle component)。
推演过程如下:
注意我们定义了一个新的矩阵,为了运算方便。可以看出明显是个对称矩阵。下面就是奇迹发生的时刻了,也就是引入特征向量分解的时候。对于任何一个对称矩阵,都有:
其中是一个对角矩阵,而是的特征向量作为列向量组成的矩阵。那我们可以用这样的方式选择:让的每一行(注意不是列)都是的特征向量,带回到上面的式子里,就能推出:
所以呢,可以得出的 2 个结论是:
- 的主成分,就是的特征向量,也就是的行向量。
- 的第个对角线元素,就是在上的方差。
本文先到这里就结束了,下一篇文章会详细地介绍下另一种更通用的解放:奇异值分解(SVD)。
大致译自此篇论文,也非常建议英语好的大家直接读原版。
以上