理解主成分分析



导言:

主成分分析法 (PCA) 是一种常用的数据分析手段。对于一组不同维度 之间可能存在线性相关关系的数据,PCA能够把这组数据通过正交变换变 成各个维度之间线性无关的数据。经过 PCA 处理的数据中的各个样本之间的关系往往更直观,所以它是一种非常常用的数据分析和预处理工具。PCA 处理之后的数据各个维度之间是线性无关的,通过剔除方差较小的那些维 度上的数据我们可以达到数据降维的目的。在本文中,我们将介绍 PCA的原理、应用以及缺陷。 


为什么要有 PCA


如果数据之中的某些维度之间存在较强的线性相关关系,那么样本在这 两个维度上提供的信息有就会一定的重复,所以我们希望数据各个维度之间是不相关的 (也就是正交的)。此外,出于降低处理数据的计算量或去除噪 声等目的,我们也希望能够将数据集中一些不那么重要 (方差小的维度剔除掉。例如在下图中,数据在 轴和 轴两个维度上存在着明显的相关性, 当我们知道数据的 值时也能大致确定 值的分布。但是如果我们不是探 究数据的 坐标和 坐标之间的关系,那么数据的 值和 值提供的信息 就有较大的重复。在绿色箭头标注的方向上数据的方差较大,而在蓝色箭头方向上数据的方差较小。这时候我们可以考虑利用蓝色和绿色的箭头表示的单位向量来作为新的基底,在新的坐标系中原来不同维度间线性相关的数据变成了线性不相关的。由于在蓝色箭头方向上数据的方差较小,在需要 降低数据维度的时候我们可以将这一维度上的数据丢弃并且不会损失较多的信息。如果把丢弃这一维度之后的数据重新变化回原来的坐标系,得到的数据与原来的数据之间的误差不大。这被称为重建误差最小化。PCA 就是进行这种从原坐标系到新的坐标系的变换的。 

image.png

 1: 示意图

如何计算PCA

数据经过 PCA 变换之后的各个维度被称为主成分,各个维度之间是线性无关的。为了使变换后的数据各个维度提供的信息量从大到小排列,变换后的数据的各个维度的方差也应该是从大到小排列的。数据经过 PCA 变换之后方差最大的那个维度被称为第一主成分。 

我们先来考虑如何计算第一主成分。假设每一条原始数据是一个\(m\) 维行向量,数据集中有\(n\)条数据。这样原始数据就可以看作一个 \(n\)\(m\)列的 矩阵。我们将其称为\(x\),用 \(x^{(i)}\)代表数据集中的第\(i\)条数据(也就是 \(X\) 的第 \(i\) 个行向量)。这里为了方便起见,我们认为原始数据的各个维度的均值都是 0。当原始数据的一些维度的均值不为时我们首先让这一维上的数据分别减去这一维的均值,这样各个维度的均值就都变成了0。为了使 \(X\) 变化 到另一个坐标系,我们需要让\(X\) 乘以一个 \(m\times m\)的正交变换矩阵\(W\) \(W\)  视为由列向量\(<w_{1},w_{2},...,w_{m}>\)组成。我们让\(X\) \(W\) 进行矩阵相乘之后就可以原始数据变换到新的坐标系中。 

  \(T=XW\) 

为了使变换不改变数据的大小,我们让 \(W\)  中的每个列向量 \(W_{i}\) 的长度都为 \(1\) ,也就是 \(\left \| W_{i} \right \|=1\)\(T\) 中的各个列向量为 \(<t_{1},t_{2},...,t_{m}>\)。为了使第一主成分 \((t_{1})\) 的方差最大,


\(\begin{align*}\frac {w^T_kX^TXw_k}{W^T_kw_k} &= \frac{\sum_{i=1}^m\lambda_i(w^T_kw_i)^2}{\sum^m_{i=1}(w^T_kw_i)^2}\\&= \frac{\sum_{i=k}^m\lambda_i(w^T_kw_k)^2}{\sum_{i=k}^m(w^T_kw_i)^2}\end{align*}\)


上述最优化问题中 \(w_{1}\) 的长度被限制为 1,为了求解 \(w_{1}\) ,我们将其变成如下的形式:

\(w_1 = \arg \max \frac {w_1^{T}X^TXw_{1}}{w_1^{T}w_1}\)

因为当 \(C\) 是一个不为零的常数时,


\(\frac{(Cw_1)^TX^TX(Cw_1)}{(Cw_1)^T(Cw_1)}= \frac {w^T_1X^TXw_1}{w^T_1w_1}\)


这时候求解出的是 \(w_1\)的方向。我们只要在这个方向上长度取长度为 1的向量就得到了结果。\(\frac {w^T_1X^TXw_1}{w^T_1w_1}\)是一个非常常见的瑞利熵,其更一般的形式是


\(\frac {x^TMx}{X^Tx}\)


这里的\(M\) 是一个厄米特矩阵 (Hermitian Matrix),在本文中我们可以将其认为是一个实对称矩阵; \(x\)是一个长度不为零的列向量。求解瑞利熵的最值需要对实对称矩阵的对角化有一定的了解。这里的 \(X^TX\)很显然是一个实对称矩阵。对一个实对称矩阵进行特征值分解,我们可以得到: 

\( M = P^TDP\)


这里的 \(D\)是一个对角矩阵,对角线上的元素是特征值;\(P=<p_1,p_2,...,p_n>\), 每个 \(p_i\) 都是一个长度为 1 的特征向量,不同的特征向量之间正交。我们将 特征值分解的结果带回瑞利熵中可以得到 


\(\frac{x^TMx}{X^Tx} = \frac{X^TP^TDP_x}{X^TP^TP_x} = \frac{\sum_i\lambda_iy_i^2}{\sum_iy_i^2} =\sum_i\lambda_i\frac{y^2_i}{\sum_k y^2_k}\)


这里的\(y_i=p_i\cdot x\)。令 \(\alpha _i = \frac{y^2_i}{\sum_k y^2_k}\),这时有\(0\leq\alpha_i\leq1\)且\(\sum_i \alpha_i = 1\)。 这样\(\frac{x^TM_x}{x^Tx}= \sum_i\lambda_i\alpha_i\) 就构成了一个一维凸包。根据凸包的性质我们可以知道,当最大的\(\lambda_i\) 对应的 \(\alpha_i =1\)时整个式子有最大值。所以当\(x\)的为最大的特征值对应的特征向量时瑞利熵有最大值,这个最大值就是最大的特征值。 根据这个结论我们就可以知道\(w_1\) 就是\(X^TX\)的最大的特征值对应的特征向 量,第一主成分\(t_1 = Xw_1\)。这样我们就得到了计算第一主成分的方法。接 下来我们继续考虑如何计算其他的主成分。因为 \(W\)是一个正交矩阵,所以


\(w_k = \arg \max \frac{w^T_kX^TXw_k}{w^T_kw_k}s\cdot t \cdot w_i^Tw_k = 0, i<k\)


因为 \(w_k\) 和 \(w_1\),\(w_2\),...\(w_{k-1}\)正交,


\(\begin{align*}\frac {w^T_kX^TXw_k}{W^T_kw_k} &= \frac{\sum_{i=1}^m\lambda_i(w^T_kw_i)^2}{\sum^m_{i=1}(w^T_kw_i)^2}\\&= \frac{\sum_{i=k}^m\lambda_i(w^T_kw_k)^2}{\sum_{i=k}^m(w^T_kw_i)^2}\end{align*}\)


为了使第\(k\)个主成分在与前\(k-1\)个主成分线性无关的条件下的方差最大,那么\(w_k\)应该是第\(k\)大的特征值对应的特征向量。经过这些分析我们就能发 现变换矩阵\(W\) 中的每个列向量就是\(X^TX\)的各个特征向量按照特征值的大小从左到右排列得到的。



接下来我们对如何计算 PCA做一个总结: 


1. 把每一条数据当一个行向量,让数据集中的各个行向量堆叠成一个矩阵。

2. 将数据集的每一个维度上的数据减去这个维度的均值,使数据集每个 
维度的均值都变成0,得到矩阵\(X\) 。 


3. 计算方阵\(X^TX\)的特征值和特征向量,将特征向量按照特征值由大到小的顺序从左到右组合成一个变化矩阵\(W\)。为了降低数据维度,我们 可以将特征值较小的特征向量丢弃。 


4. 计算\(T=XW\),这里的\(T\)就是经过PCA之后的数据矩阵。


除了这种方法之外,我们还可以使用奇异值分解的方法来对数据进行 PCA处理,这里不再详细介绍。


PCA 的应用

首先我们来看一下 PCA 在数据降维方面的应用。我们在 MNIST 数据 集上进行了测试。我们对 MNIST 的测试集中的每一幅 28×28 的图片的变成 一个 784 维的行向量,然后把各幅图片拼接成的行向量堆叠一个 784×10000 的数据矩阵。对这个数据矩阵进行 PCA 处理。处理得到的特征值的分布如 下图。通过图片我们可以看出前面一小部分的特征值比较大,后面的特征值

image.png

图 2: MNIST 数据集特征值的分布

都比较接近于零。接下来我们取前200,300 个主成分对数据进行重建。我 们发现使用前 200 个主成分重建的图像已经能够大致分辨出每个数字,使 用前 300 个主成分重建的图像已经比较清晰。根据实验我们可以发现 PCA 能够在丢失较少的信息的情况下对数据进行降维。


PCA 在自然语言处理方面也有比较多的应用,其中之一就是用来计算 词向量。word2vec 是 Google 在 2013 年提出了一个自然语言处理工具包


image.png

图 3: 原始图像

image.png

图 4: 使用前 200 个主成分重建的图像

image.png

 5: 使用前 300 个主成分重建的图像

其思想是用一个向量来表示单词,意思和词性相近的单词对应的向量之间 的距离比较小,反之则单词之间的距离比较大。word2vec 原本是使用神经网络计算出来的,本文中的 PCA 也可以被用于计算词向量。具体的做法为构建一个单词共生矩阵,然后对这个矩阵进行 PCA 降维,将降维得到的数 据作为词向量。使用这种方法构造出的词向量在单独使用时效果虽然不如 使用神经网络计算出的词向量,但是将神经网络构造出来的词向量和使用 PCA 降维得到的词向量相加之后得到的词向量在表示词语意思时的效果要 好于单独使用神经网络计算出来的词向量。

image.png

 6: 一个共生矩阵的例子

图片来自于斯坦福大学公开课 cs224n 课件

PCA 的缺陷

虽然 PCA 是一种强大的数据分析工具,但是它也存在一定的缺陷。一 方面,PCA 只能对数据进行线性变换,这对于一些线性不可分的数据是不利的。为了解决 PCA 只能进行线性变换的问题,Schölkopf, Bernhard 在 1998 年提出了 Kernel PCA。Kernel PCA 在计算\(M=X^TX\)的时候不是直接进行相乘,而是使\(\overline{m_ij} = \Phi (x_i)^T \Phi(x_j)=K(x_i,x_j)\)。这里的\(k(x_i,x_j)\)是一个与支持向量机中类似的核函数。这样就能够对数据进行非线性变换。另一方面,PCA 的结果容易受到每一维数据的大小的影响,如果我们对每一维数据乘以一个不同的权重因子之后再进行 PCA降维,得到的结果可能与直接进行PCA降维得到的结果相差比较大。对于这个问题,Leznik 等人在论文Estimating Invariant Principal Components Using Diagonal Regression 中给出了一种解决方案。除此之外,PCA 要求数每一维的均值都是0,在将原始数据的每一维的均值都变成0时可能会丢失掉一些信息。虽然PCA有这些缺陷,但是如果合理的利用,PCA 仍然不失为一种优秀的数据分析 和降维的手段。

参考文献

1.     Pearson, K. (1901). ”On Lines and Planes of Closest Fit to Systems of Points in Space”. http://stat.smmu.edu.cn/history/pearson1901.pdf. Philosophical Magazine. 2 (11):559–572. 


2.     Principal component analysis(主成分分析). https://en.wikipedia.org/wiki/Principal_component 


3.     Rayleigh quotient(瑞利熵). https://en.wikipedia.org/wiki/Rayleigh_quotient.Wikipedia. 


4.     Hermitian matrix(厄米特矩阵). https://en.wikipedia.org/wiki/Hermitian_matrix.Wikipedia. 


5.     Yann LeCun. [MNIST 数据集] (http://yann.lecun.com/exdb/mnist/). 


6.     Tomas Mikolov, Ilya Sutskever, Kai Chen, Greg Corrado, Je rey Dean.(2013)”Distributed Representations of Words and Phrases and their Compositionality”.https://arxiv.org/pdf/1310.45 arxiv.org. 


7.     Schölkopf, Bernhard (1998). ”Nonlinear Component Analysis as a Kernel Eigenvalue Problem”. Neural Computation. 10: 1299–1319. doi:10.1162/089976698300017467. 
Leznik, M; Tofallis, C. 2005 [uhra.herts.ac.uk/bitstream/handle/2299/715/S56.pdf Estimating Invariant Principal Components Using Diagonal Regres-
sion.]


理解主成分分析.pdf


微信扫一扫
关注公众号