欢迎各位童鞋交流和指教!
1. 前言
在接触到了文本的分布式表示(或称嵌入式、向量)后,发现深入学习和理解主成分分析十分有必要,主成分分析(Principal Component Analysis,PCA)可以帮助我们把数据中,相对不重要、或者说对于数据没有很强的区分能力的维度去掉,将数据映射到一个有着主要能区分数据、数据的相关性不大的维度空间里。
这是一个非常经典和美妙的数据分析方法。属于数据降维的方法中的一种(如SVD、LDA、t-SNE等等)。而且在上次师兄讲过PCA的原理后(虽然走神了没听懂。。。)一直想学习和实践,因为这个方法对于目前我对于数据的分析十分有用和迫切需要。前几天把PCA的数学原理学习了一下,同时还回去复习了一下线代。。。今天趁着周末有空就来实践一下啦!
接下来我将阐述PCA的数学原理,以及在scikit-learn、matlab和谷歌的embedding projector上进行实验。
2. PCA的数学原理
在数据挖掘和机器学习中,数据通常被表示成向量。举一个网上人们嚼的烂的例子,某淘宝店一年的数据分析信息如下,其中每一条代表了一天的交易数据:
[日期,浏览量,访客数,下单数,成交数,成交金额]
一般来讲,日期是一个记录标志,不是度量值,我们对于数据分析分析的是度量值,所以把日期删掉。然后得到一个五维向量:
[浏览量,访客数,下单数,成交数,成交金额]T
我们一般取列向量而不是行向量,因为当多条数据组成矩阵之后每一列代表一条数据,可以在后面的运算看到,这样表示的话方便我们表示特征矩阵及之后的运算(估计是习惯了吧,词向量那块人们也都这样做的,忽然转过去的话看起来不习惯。。)。
那么什么是主要成分、什么是区分不同数据能力不强的特征(维度)?
对于上面的例子来说,浏览量和访客数往往具有较强的相关关系,下单数与成交数也有较强的相关关系,所以这两对每一对的两个特征之间对于数据的区分能力不强,也就是说这两对每一对的两个特征中,我们可以去掉其中任意一个,我们期待这样并不会丢失太多信息。为什么要删除呢?因为我们要降低机器学习算法的复杂度。
以上讲的就是PCA的简单的思想描述,有助于直观理解降维的动机和可行性,但并不具有操作指导意义。如:对于数据维数非常大,并且各维没有实际含义,我们应该删除哪行?如何度量各维度携带的信息量?
所以接下来就要介绍PCA主要的实现原理了。
2.1 PCA的主要实现原理
在讲原理之前不得不提的就是向量(或矩阵)的乘法的理解问题了,这里我们举一个简单的例子:A=(X1,Y1)、B=(X2,Y2),对于这两个向量的点乘AB我们知道可以表示为:A在B向量上的投影*B向量的长度,如下图所示。那如果B向量的长度是单位长度,那点乘就是A向量在B上的投影长度,将这个想法拓展到矩阵(如果B矩阵每一列的L2范数等于1),我们可以认为是A矩阵在B矩阵表示的向量空间中的投影。
目前所使用的这种坐标系是经典的笛卡尔坐标系,也就是默认基底由(如果是2维空间的话)(1,0)(0,1)组成,那么如果我们找到一组基底,基底之间线性无关,那么就可以构成一个向量空间。
例如二维空间,我们可以使用(1,1)(-1,1)组成一组基底。但我们希望基底模(L2范数)为1,所以归一化后,如下图表示一个(3,2)的向量在新的基底表示下的坐标: