注:本文是总结Lindsay I Smith的A tutorial on Principal Components Analysis一文的一些总结,主要对机器学习以及数据挖掘方向的小伙伴参考,如果有任何错误的地方,望大家以及与本人交流以便日后改正。
1. 介绍
Ok,下面进入正题。所谓的主成分分析(PCA),顾名思义,就是提取样本的一些信息,保留其中主要的部分并舍弃剩余不重要的部分。这个概念有点类似于抽样,如果熟悉图像处理的同学可能知道,图像中存在了大量人眼看不到的颜色,这也是为什么有了JPEG、JPEG2000等图像压缩标准的原因。有了简单的理解以后,我们先来了解一下PCA中需要的一些数学概念。当然,如果你了解这些概念可以直接跳过。
2. 数学概念
均值
首先我们需要知道的是均值的概念,也就是所谓的样本的平均数。对于一个给定的集合X={0,1,2,3,2,1,3,4,5},其中的第i个元素我们用Xi来表示,那么该集合内所有元素的均值可以表示为
其中,n为集合X中元素的个数。
标准差
标准差的概念非常有用。如果我们只知道一个集合的均值,那么无论你的样本波动有多大,我们得到的均值都是相同的。考虑下面两个集合{0,20,10}和{11,9,10}。这两个集合的均值都是10,然而很明显第二个集合的波动很小。下面给出标准差的数学公式
可能有人会疑问为什么分母是n-1,这个我只能说是根据经验而来的。如果对整个样本求标准差的时候,那么分母必为n。但是如果只是对整体样本的抽样(不是整体样本)求标准差的时候,n-1更为合适。
方差
方差就是标准差的平方,一般用var(X)来表示,意义和标准差相同,这里就不再赘述。
协方差
细心的同学可能会发现,上面所说的几个概念都是针对一维数据的。对于二维数据,我们一般采用协方差的概念。其公式可以表示为
如果把公式里的Y换成X,我们会发现上面公式即为X的方差。协方差的物理意义在于,如果协方差的值小于0,那么随着一个维度的值增加,比如X,那么另一个维度的值将会减少;如果协方差的值大于0,那么随着一个维度的值增加,另一个维度的值也会相应的增加;如果为0,则表示X与Y是相互独立的,也就是说X的变化并不会影响Y的变化。
协方差矩阵
上面说到协方差是针对二维数据的量,那么如果数据的维数大于2维怎么办。这里我们将引入协方差矩阵的概念。对于三维的协方差矩阵可以表示为
不难发现矩阵真的每一项对应真相应两个维度的协方差矩阵,主对角线元素为三个维度上的方差,并且这个矩阵是关于主对角线对称的。因为
这个可以从协方差的公式直接推得。
特征向量和特征值
对于一个给定的n阶方阵A,注意必须是方阵,如果可以表示为如下形式
其中X为一个n维向量,那么我们说X为A的一个特征向量,r为A的一个特征值。值得注意的是一个n阶矩阵一般会有n个特征向量,并且这n个特征向量是互相正交的。还有一点,我们通常会将得到的特征向量做归一化处理,也就是说得到的特征向量的长度为1。
Ok,有了这些数学概念,下面我们正式的来介绍PCA。
PCA是一个非常有用的数据分析工具,在实际应用中,比如说银行或者大型的互联网公司每年会从用户那里得到大量的数据,如果对所有提取的数据同时做分析将会是一个非常巨大的任务,即使花费了大量的功夫完成的任务,结果也不一定是理想的。PCA一个很好的优点就是可以对数据降维。换句话说,如果原始数据有20维,通过PCA算法变换之后,也会得到20维数据,但是得到的这20维数据是根据维度的重要性排列的,我们可以取其中最重要的10维数据进行分析。这样可以将原始数据压缩一半从而大大减少我们的计算量。
3. PCA
下面介绍一下PCA在处理数据时的具体步骤:
首先,我们需要获得原始的数据,这里我们借用Lindsay I Smith论文中的数据。该数据是二维的,见下图
左图为原始数据,右图给出了数据在坐标上的位置。
第二步,针对每一维度计算对应的均值,比如这里x对应的均值为1.81,y对应的均值为1.91。然后用原始数据减掉每一维度对应的均值,得到调整后的数据。此时,每一维度对应的均值都为0,这样便于我们以后的计算。调整后的数据可以表示为
第三步,计算调整后数据的协方差矩阵,由于我们的数据是二维的,因此得到的协方差矩阵也将会是2阶方阵,由于计算比较简单,这里我直接给出。
通过得到的协方差矩阵我们可以发现,该方阵是关于主对角线对阵的。
第四步,计算上面得到的协方差矩阵的特征值和特征向量。
第五步,计算我们想要的新数据。首先我们要根据需要,选取需要的特征向量。那么到底要选哪个特征向量,这个已经有人证明(实际也是这样)特征值越大,对应的特征向量也就越重要,比如上面的例子中,由于1.28402771这个特征值比较大,因此它对应的特征向量(-0.677873399,-0.735178656)就比较重要。
下图给出了得到的两个特征向量对应的直线,我们会发现原始数据主要是按照特征值较大的特征向量来分布。这也是我们将特征向量按重要性排序的一个理由。
此时我们需要将需要的特征向量按重要性排列成一个新的特征矩阵。步骤是先选取最重要的特征向量,将其转置后放到新的特征矩阵的第一行,然后是第二重要的特征向量,以此类推。我们最后想要的数据就是这个新得到的特侦矩阵乘以上面调整后的数据(也就是减完对应均值得到的数据)。拿上面的例子来说,如果我们只想去这个二维数据中最重要的一维,由于特征值1.28402771是最大的,我们当然就选取它对应的特征向量的转置作为新的特征矩阵的第一行。由于只有要一维新的数据,因此最终的特征矩阵也就是(-0.677873399,-0.735178656)。然后用这个特征矩阵*调整后的数据就会得到降维后新的数据。