1 从超级纸片马里奥说起

2007 年,任天堂的游戏机 Wii 上推出了一款超级纸片马里奥(super paper Mario)的游戏。在大多数操作中,它十分接近传统的超级马里奥,是一个 2D 的游戏,玩家控制马里奥从左至右移动闯关,如下图所示。

主成分分析的方法与原理(换个角度看世界)(1)

然而,这款游戏与前作的最大区别是它加入了横向卷轴(side-scrolling)功能。这相当于给玩家提供了全新的侧视角机位(a side-view camera angle)。在这个侧视角下,游戏一下从 2D 扩展到 3D。比如上面那副游戏画面的从侧视角来看,就变成了下面这样。在 2D 图中看似在同一平面上的两组砖块儿在 3D 视角中竟然有着完全不同的轴向坐标。

主成分分析的方法与原理(换个角度看世界)(2)

游戏的大部分都在 2D 中进行。然而,在游戏中,马里奥被赋予了“翻转画面”至 3D 的能力。通过这样做,透视将发生移动、且 2D 画面发生旋转并显示出隐藏的 Z 轴,将马里奥置于 3D 环境中。翻转使玩家可以绕过 2D 中存在的障碍物,或者寻找仅在 Z 轴上才可见的物品和地形。

怎么样,有没有“事情的脉络早已非常清晰,只是我们需要找到正确的视角”的感觉?

让我们从这个游戏引申一步。上面的游戏画面中,无论是马里奥,还是砖块儿或者其他游戏元素,构成它们的是屏幕上不同配色的像素,在计算机看来它们无非是大量的数据。这些数据在 2D 视角下呈现出一些模糊的结构,而“翻转到 3D”使这个模糊的结构从一个全新的角度清晰地展现到我们面前,我们可以从中发现很多之前看不到的信息。

对于一组多变量的数据,通过转换观察数据的角度,揭示出数据内在的结构,这个过程就叫做主成分分析(principal component analysis,PCA)。主成分分析作为基础的数学分析方法,其实际应用十分广泛,比如人口统计学、分子动力学、数学建模、数理分析、以及量化投资等学科中均有应用,它是一种常用的多变量分析方法。

2 直观理解 PCA

在用统计方法分析多变量的数据集时,变量太多会大大增加问题的复杂性。此外,在很多问题中,变量之间普遍存在一定的线性相关性,这就造成了被不同变量所代表的数据信息有重叠。面对这些问题,一个自然的想法是“能否使用较少的但是没有相关性的变量来获取尽可能多的原始数据的信息?”。由此便提出了主成分分析(PCA)。

PCA 从原始变量出发,通过旋转变化(即原始变量的线性组合)构建出一组新的、互不相关的新变量,这些变量尽可能多的解释原始数据之间的差异性(即数据内在的结构),它们就称为原始数据的主成分。由于这些变量不相关,因此它们无重叠的各自解释一部分差异性。依照每个变量解释的差异性大小排序,它们称为第一主成分、第二主成分、以此类推。

来看一个生动的例子。

下面的动态图展现了一组三维空间内看似杂乱无章的原始数据(看不出差异性)经过 PCA 变换后在新的变量(即图中的坐标轴)视角下呈现的图案。当我们用新的变量(坐标轴)来绘制这些数据时,它们所传达的信息就更加清晰的呈现出来(由于数据点的差异性被体现出来,一团看似无序的散点变成了一只企鹅图案!)。这就是 PCA 的魅力。

主成分分析的方法与原理(换个角度看世界)(3)

下面就来看看 PCA 的数学含义。

3 数学含义——认清去均值化的重要性

PCA 在数学上定义为一个正交线性变换(orthogonal linear transformation),将原始数据转换到一个新的坐标系统,该系统中的坐标称为主成分(principal components),它们相互正交,因此是不相关的。如果我们将原始数据投影到这些主成分上,它们满足以下条件:

以此类推。

这些主成分构成了一组不相关的正交基集,每个主成分解释了原始数据中的一部分差异性(由投影数据的方差表示);从第一主成分开始,解释差异性的多少依次递减。换句话说,如果我们想找到一个“视角”来观察这些数据,使得它们看起来差别最明显(比从任何其他角度看这些数据的差别都明显),那么这个“视角”就是第一主成分。

PCA 是一种降维(dimension reduction)分析方法;主成分的个数应小于或等于原始变量个数以及观测值的个数。因此 PCA 能够使用低维度的正交变量来解释高维度(原始变量)的数据信息——我们将高维度的原始数据投影到低维度的 PCA 主成分中。

下面简单说说如何从数学上求解主成分,从而引出 PCA 中一个非常关键的概念——去均值化(demean)

假设 X 代表一个 n × p 的矩阵,每一行代表一个观测值(因此一共有 n 个观测值),每一列代表一个变量维度(因此有 p 个原始变量)。此外,在求解主成分前已经对原始数据中的每个维度都进行了去均值化,即 X 的每个列向量中的样本数据的均值都为 0。去均值化对于 PCA 的分析结果是否正确至关重要。至于为什么,请接着往下看。

我们首先来求解第一主成分。它是原始 p 个维度的线性组合。定义列向量 w_(1) 如下,它代表第一主成分中这 p 个维度的权重:

主成分分析的方法与原理(换个角度看世界)(4)

其中带括号的下标 (1) 表示第一主成分,此外 w_(1) 的范数等于 1X 中的每一行 x_i 为一个去均值化后的原始数据(它是一个 1×p 的行向量),因此它在第一主成分上的投影相当于 x_i 与 w_(1) 的内积。它是一个标量,它又称为主成分得分(principal component score)。原始数据 x_i 在第一主成分上的投影,记为 t_i(1),为:

主成分分析的方法与原理(换个角度看世界)(5)

对于所有的原始数据 x_i 求出它们在第一主成分上的投影 t_i(1),下面要做的就是使这些投影点的方差最大。方差如何定义呢?方差是否等于所有 t_i(1) 的平方和呢?

在第一主成分对应的坐标轴上,t_i(1) 代表着原始数据 x_i 的投影点到该坐标系原点的距离。因此所有 t_i(1) 的平方和的数学含义是所有这些投影点到原点的距离的平方和(sum of squared deviation from origin)

注意,重要的事情说三遍:

来看一个例子。假设二维空间中有两个变量 v1 和 v2,以及它们的一组观测值(如下图左侧的情况所示)。如果在进行 PCA 时未进行去均值化,则得到的第一主成分是一条通过原点的 45 度的直线。然而,即便是通过肉眼观测我们也可以发现原始数据的方差在这个方向上并不是最大的。因此,这个第一主成分是错误的。

主成分分析的方法与原理(换个角度看世界)(6)

之所以会发生这样的情况,是因为 PCA 是一种旋转变换,因此得到的新的由主成分构成的坐标系必然要经过原始坐标系的原点。在这个例子中,原始观测点聚集在坐标 (4, 4) 附近。如果不去均值化,坐标系统将围绕着原始坐标系中的点 (0, 0) 旋转。在这种情况下,在计算投影点到原点的距离平方和时,原点正是 (0, 0)。图中 45 度斜线上方密密麻麻的黑点为原始数据的投影点,它们围绕在 (4, 4) 附近。由于没有去均值化,在计算距离平方和时,(0, 0) 到 (4, 4) 之间的距离的平方将被错误地算作投影点自身方差的一部分,使得投影点的方差在 45 度斜线这个方向上显得最大,因此这个方向被错误地选为第一主成分。

正确的做法是对原始数据去均值化。这样,原点被移动到原始数据的中心(如上图中右侧的情况)。围绕着新的原点进行 PCA 便可以正确的发现真正的第一主成分,即穿过新原点的 135 度直线方向。由于已经移动了原点,因此投影点到原点的距离平方和就正比于投影点的方差。从上图也不难看出,在该方向上的投影点的距离平方和最大,即方差最大。这就是为什么在进行 PCA 之前要对原始数据去均值化。

在去均值化的前提下,“最大化投影点在第一主成分上的方差”等价于“找到 w_(1) 使 t_i(1)的平方和最大”。这就意味着,第一主成分的权重 w_(1) 是下面这个最优化问题的解:

主成分分析的方法与原理(换个角度看世界)(7)

将上式右侧写成矩阵形式为:

主成分分析的方法与原理(换个角度看世界)(8)

可以证明,上式右侧中的优化函数的最大值为对称矩阵 (X^T)X 的最大特征值(the largest eigenvalue),该值当 w 取为这个特征值对应的特征向量(eigenvector)时实现。这里先埋个伏笔,看完下一节你就知道这里为什么特意引出对称矩阵 (X^T)X,以及它的特征向量和特征值。

求出 w_(1) 之后,便找到了第一主成分。原始数据在第一主成分上的投影就是 t_i(1)。确定了第一主成分后,便可以依次确定第二、第三主成分,以此类推。具体的,假设已经确定了前 k - 1 个主成分(k ≥ 2),为了确定第 k 个主成分,只需要从原始数据 X 中减去前 k - 1 个主成分,然后对剩余的新的数据进行投影点到原点距离平方和最大化的求解,从而得到第 k 个主成分的权重向量 w_(k)。

这种方法听起来比较繁琐,因为要通过迭代依次找到主成分。但我的目的是想通过对数学步骤的描述强调去均值化的重要性。在实际应用时,PCA 可以通过对原始 n × p 维的数据 X进行协方差矩阵的特征分解求得。

4 对协方差矩阵进行特征值分解

在上节的数学推导中曾留下一个伏笔:求解去均值化后的数据 X 的第一主成分等价于求解对称矩阵 (X^T)X 的最大特征值对应的特征向量。事实上,求解 X 的前 k 个主成分就相当于求解对称矩阵 (X^T)X 的最大的 k 个特征值各自对应的特征向量。它们就是 X 的 k 个主成分。

再来看看 (X^T)X 是什么。去均值化后,对称矩阵 (X^T)X 正比于 X 的协方差矩阵。事实上,X 的协方差矩阵正是 Cov(X) = (X^T)X / (n-1)。注意:如果未对 X 进行去均值化,则 Cov(X) 不等于 (X^T)X / (n-1)。

根据上面的论述,我们只需首先对原始数据去均值化并求出它的协方差矩阵;在得到协方差矩阵后,对该矩阵进行特征值分解(eigen-decomposition)得到特征值和特征向量;之后,将特征值从大到小排序,取前 k 个特征值对应的特征向量,它们就是我们要找的 k 个主成分。

根据协方差的定义,计算协方差的过程中便已对数据进行了去均值化,因此对于求解代表主成分的特征向量,并不需要在求协方差均值之前人工对数据去均值化。然而,考虑到 PCA 是旋转变换且坐标系统的原点应该位于多变量数据的多维均值之上,因此在计算原始数据点在主成分上的投影时,仍应将数据进行去均值化处理。此外,除了本节介绍的协方差矩阵的特征值分解外,还有其他求解 PCA 的方法,比如 Python 的 sklearn 统计包使用的是对矩阵 X 直接进行奇异值分解(singular value decomposition,SVD)。在采用这种解法时,如果没有人工对数据去均值,那么SVD的计算结果便有可能是错误的。因此,在进行 PCA 时,无论是用什么方法,首先应对数据去均值化。

下面通过一个例子来说明对协方差矩阵进行特征值分解的过程。

假设有两个变量 A 和 B 的 10 个观测点,如下表所示。我们希望找出它们的第一主成分。

主成分分析的方法与原理(换个角度看世界)(9)

第一步:去均值,得到去均值化后的数据

主成分分析的方法与原理(换个角度看世界)(10)

第二步:计算协方差矩阵

去均值化后数据的协方差矩阵为:

主成分分析的方法与原理(换个角度看世界)(11)

第三步:对协方差矩阵进行特征值分解

得到特征值为 0.07650136 和 1.36494309。二者中较大特征值对应的特征向量为:[-0.68212146, -0.73123889]^T,这就是数据的第一主成分。

第四步:计算原始数据在第一主成分上的投影

用去均值后的数据和第一主成分内积,便得到原始数据在第一主成分上的投影。为了验证结果的正确性,我们同时采用 Python 的 sklearn 包自带的 PCA 计算第一主成分。从下表的结果可以看到,上述计算和使用软件包的计算结果是一致的。

主成分分析的方法与原理(换个角度看世界)(12)

来看看第一主成分在二维平面上是什么方向的。下图中,蓝色的圆圈是原始去均值化后的数据,绿色的直线是第一主成分的坐标轴。红色的方块是原始数据在其上的投影。不难看出,在第一主成分上,投影点的方差最大。如果我们把这 10 个点投影到非第一主成分的其他方向上,那些投影点的方差都没有第一主成分上这些投影点的方差大。即第一主成分是最能够体现这些点之间差异化的那个视角。

主成分分析的方法与原理(换个角度看世界)(13)

5 尺度缩放的重要性

最后——last but not least——想指出的一点是,PCA 对原始变量的相对尺度十分敏感。如果在一组变量中,某一个变量的量纲非常大,那么这个变量很可能主宰观测数据的方差,导致第一主成分非常接近这个变量,而这样的结果往往没有太大的意义。

比如在一个问题中,某一个变量是长度,如果我们把它的单位从米改成厘米,则数量级大了 100 倍,计算方差的时候该变量方差的数量级则大了 10000 倍。然而量纲的变化对于数据本身的内部结构并没有改变,但我们会因此错误的认为长度这个变量是一个解释方差的最重要因素,这就有问题了。

因此,在进行 PCA 时,往往有必要结合数据的业务含义对变量进行尺度缩放(scaling),使得不同变量之间在量纲上具有可比性。需要强调的是,在 scaling 的技巧中并没有标准答案,因此需要具体问题具体分析。

下面这两个示例图展示了是否 scaling 对 PCA 结果的影响。上图中,由于没有 scaling,导致得到的第一主成分完全秒杀了其他主成分,这样会使使用者认为数据之间的区别仅仅存在于第一主成分中。而经过适当的 scaling 后(下图),PCA 的结果更加合理,前四个主成分依次解释了数据中的方差。

主成分分析的方法与原理(换个角度看世界)(14)

6 结语,PCA 与量化投资

在分析多变量数据时,变量之间错综复杂的相关性往往为我们探究其内部的结构设置了层层障碍。而不同变量之间传递的带有重叠性的信息更会使我们错误的高估一些变量的作用。

放眼量化投资领域,多因子量化选股无疑是一个可以使用 PCA 来分析的课题。人们主观的将因子归纳为估值因子、质量因子、成长因子、动量因子等,就是希望降低不同类别因子之间的相关性,使它们各自代表股票超额收益中不同的风险敞口。然而,由于这些因子都是来自市场交易数据以及公司财报,它们之间一定存在着千丝万缕的联系(即相关性)。如果我们想要彻底排除因子之间的相关性、降低分析问题的复杂性、同时捕捉到股票在不同因子之上的差异,PCA 无疑会有用武之地。它可以把传统的因子转化为一组完全正交的主成分,这有助于提高量化选股的准确性。

,