在进行数据分析时,我们往往会遇到多维数据,多维数据在处理时由于维度较大计算起来非常麻烦,这时我们需要对数据进行降维。而在所有降维方法中,PCA是我们最常用的方法之一,其在使用时可以消除指标间的相互影响,同时也不用考虑数据的分布,而且降维效果非常明显,所以PCA可以在绝大多数情况下使用。而本文就是用python来解释一下如何用PCA方法进行降维。
首先对PCA进行一下简介。PCA全称是principal components analysis,即主成分分析。假设对某一事物的研究设计p个指标,分别用X1、X2、......、Xp
表示,这p个指标构成的p维随机向量为X=(X1, X2, ..., Xp)’
,设X
的均值为μ
,协方差矩阵为Σ
。对X进行线性变换,可以形成新的综合变量,用Y表示,也就是说新的变量可以由原来的变量线性表示,即满足图1中的关系。
由于这个线性变换是任意的,所以可以得到不同的Y。为了取得理想的效果,我们希望Yi=(ui)’X
的方差尽可能大且Yi之间相互独立。所以我们将线性变换约束在下面的条件之内:(1)(ui)’(ui)=1 (i=1, 2, 3, ..., p)(2)Yi与Yj相互无关(i不等于j,i, j=1, 2, 3, ..., p)(3)Y1是X1、X2、...、Xp的一切满足条件(1)的线性组合中方差最大者,Y2是与Y1不相关的X1、X2、...、Xp所有线性组合中方差最大者,......,Yp是与Y1、Y2、...、Y(p-1)不相关的X1、X2、...、Xp的所有线性组合中方差最大者。基于以上三条原则确定的综合变量Y1、Y2、...、Yp分别称为原始变量的第一、第二...第p个主成分。各综合变量在总方差中所占的比重依次递减。在实际运用中,我们往往选取方差最大的几个主成分,就达到了降维的目的。下面就用python代码结合实际例子来说明一下PCA的具体用法。在这里我们要说明一下本次使用的数据集,该数据集是Iris Flower Dataset,即著名的鸢尾花数据集。该数据集只有5个维度(其中我们主要用到前4个维度),样本量也只有150个,整个数据集比较轻便,非常适合做数据展示。首先导入需要的库。
接下来读取相关数据集,这个数据集位于seaborn库当中。前8行数据如图2所示。
然后对数据做一个简单的处理,看一下各个维度之间的相关关系。所得结果如图3和图4所示。
从图中可以大致看出,sepal_length和petal_length与petal_width都有较强的相关性,而petal_length和petal_width的相关性最强,达到0.96。下面我们来用PCA具体来分析一下该数据集,首先先看看该数据在选取4个主成分下的情况,这时候其主成分的数量和原数据的维度数相等。其结果如图5所示。
我们可以看到pca.explained_variance_ratio_
的结果是[0.92461872 0.05306648 0.01710261 0.00521218],而图5中也显示前两个主成分之和就已经接近所有主成分的98%,所以在只考虑前两个主成分的情况下,我们就能够将数据的损失控制在很小的范围内。这里我们就只用前两个主成分来做分析。接下来我们就只用前两个主成分来分析原数据,将两个主成分的数据转换成dataframe格式,然后再加上一列原数据中species的数据,代码如下,结果如图6所示。
接下来我们来看一下这两个主成分的组成。
结果如下。
用这个结果来验证一下前面的数据。按照图1中的原理来计算,pca1.components_
第一行的数据和values第一行数据对应项相乘的和,应该等于pc1_df
中pc_1
列第一个数据-2.684126,即图6中第一行第一列数据。即有下列代码。
按照上式计算,结果是2.8182395066394683。很多人看到这里,认为是不是算错了,其实我们在计算方法上都没有错,只是在这里有一个隐含条件没有满足,就是sklearn在进行PCA计算时,数据要进行“中心化”,即每个数据减去这组数据的平均值,这样做主要是为了后续方便计算。所以我们要把上述代码改为下面这样。
其得到的结果是-2.684125625969536,这就和前面的-2.684126对应起来了(这里排除小数点精度问题)。接下来就是用我们降维后的数据来作图。我们将原先的数据从4维降为2维,这正好方便绘制二维图,代码如下。结果如图7所示。
主成分分析这种方法虽然简单易用,但其也有自身的缺点,比如对降维最终得到数目,不能很好地估计,同时PCA对于维度之间非线性的依赖关系不能得到很好的结果。此外本例中笔者没有对原数据进行标准化,因为标准化可能会损失一定信息,这个问题业界也争论了很长时间,到底是否对数据进行标准化需要根据实际情况来判断,因为本例中各维度之间的数据差异不大,所以笔者并未进行标准化。所以针对PCA的使用,大家还是要根据数据的要求来进行判断。