1.相关背景
在许多领域的研究应用中,通常需要对含有多个变量的数据进行观测,收集大量数据后进行分析寻找规律。多变量大数据集无疑会为研究和应用提供丰富的信息,但是也在一定程度上增加了数据采集的工作量。更重要的是在很多情形下,许多变量之间可能存在相关性,从而增加了问题分析的复杂性。如果分别对每个指标进行分析,分析往往是孤立的,不能完全利用数据中的信息,因此盲目减少指标会损失很多有用的信息,从而产生错误的结论。
因此需要找到一种合理的方法,在减少需要分析的指标同时,尽量减少原指标包含信息的损失,以达到对所收集数据进行全面分析的目的。由于各变量之间存在一定的相关关系,因此可以考虑将关系紧密的变量变成尽可能少的新变量,使这些新变量是两两不相关,那么就可以用较少的综合指标分别代表存在于各个变量中的各类信息。主成分分词与因子分析就属于这类降维算法。
2.数据降维
降维就是一种对高维度特征数据预处理方法。降维是将高维度的数据保留下最重要的一些特征,去除噪声和不重要的特征,从而实现提升数据处理速度的目的。在实际的生产和应用中,降维在一定的信息损失范围内,可以为我们节省大量的时间和成本。降维也成为应用非常广泛的数据预处理方法。
降维具有如下一些优点
(1)使得数据集更易使用
(2)降低算法的计算开销。
(3)去除噪声
(4)使得结果更容易理解
降维的算法有很多,比如奇异值分解(SVD)、主成分分析(PCA)、因子分析(FA)、独立成分分析(ICA)、LDA
3.PCA原理详解
3.1PCA概念
PCA(Principal Component Analysis),即主成分分析方法,是一种使用最广泛的数据降维算法。PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。PCA的工作就是从原始的空间中顺序地找一组相互正交的坐标轴,新的坐标轴的选择与数据本身是密切相关的。其中,第一个新坐标轴选择是原始数据中方差最大的方向,第二个新坐标轴选取是与第一个坐标轴正交的平面中使得方差最大的,第三个轴是与第1,2个轴正交的平面纸方差最大的。依次类推,可以得到n个这样的坐标轴。通过这种方式获得的新的坐标轴,我们发现大部门方差都包含在前面k个坐标轴中,后面的坐标轴所含的方差几乎全为0。于是,我们可以忽略余下的坐标轴,只保留前面k个含有绝大部分方差的坐标轴。事实上,这相当于只保留包含绝大部分方差的维度特征,而忽略包含方差几乎为0的特征维度,实现对数据特征的降维处理。
思考:我们如何得到这些包含最大差异性的主成分方向呢?
事实上,通过计算数据矩阵的协方差矩阵,然后得到协方差矩阵的特征值特征向量,选择特征值最大(即方差最大)的K个特征所对应的特征向量组成的矩阵。这样就可以将矩阵转换到新的空间当中,实现数据特征的降维。
由于得到协方差矩阵的特征值特征向量有两种方法:特征值分解方差矩阵、奇异值分解协方差矩阵,所以PCA算法有两种实现方法:基于特征值分解协方差矩阵实现PCA算法、基于SVD分解协方差矩阵实现PCA算法。
两个标准:
1)不同特征之间的方差尽可能大(投影后数据尽可能分开)
2)不同特征之间的协方差等于0(特征之间的相关性)
3.2 协方差和散度矩阵
样本均值:
样本方差:
样本X和样本Y的协方差矩阵:
由上面的公式,我们可以得到以下结论:
(1)方差的计算公式是针对一维特征,即针对同一特征不同样本的取值来进行计算得到;而协方差则必须要求至少满足二维特征;方差是协方差的特殊情况。
(2)方差和协方差的除数是n-1,这是为了得到方差和协方差的无偏估计。
协方差为正时,说明X和Y是正相关关系;协方差为负时,说明X和Y是负相关关系;协方差为0时,说明X和Y是相互独立。Cov(X,X)就是X的方差。当样本是n维数据时,他们的协方差实际上是协方差矩阵(对称矩阵)。
对于数据X的散度矩阵为。其实协方差矩阵和散度矩阵关系密切,散度矩阵ius协方差矩阵乘以(总数据量-1)。因此他们的特征值和特征向量是一样的。这里值得注意的是,散度矩阵是SVD 奇异值分解的一步,因此PCA和SVD是有很大联系。
3.5 PCA算法两种实现方法
(1) 基于特征值分解协方差矩阵实现PCA算法
输入:数据集,需要降到K维。
1)去平均值(即去中心化),即每一位特征减去各自的平均值。中心化的原因:
2)计算协方差矩阵,注:这里除或不除样本数量n或n-1,其实对求出的特征向量每一影响。
3)用特征值分解方法求协方差矩阵的特征值特征向量
4)对特征值从大到小排序,选择其中最大的k个。然后将其对应的k个特征向量分别作为行向量组成特征向量矩阵P。
5)将数据转换到k个特征向量构建的新空间中,即Y=PX。
注意:如果我们通过特征值分解协方差矩阵,那么我们只能得到一个方向的PCA降维。这个方向就是对数据矩阵X从行(或列)方向上压缩降维。
(2)基于SVD分解协方差矩阵实现PCA算法
输入:数据集,需要降到K维。
1)去平均值,即每一位特征减去各自的平均值。
2)计算协方差矩阵。
3)通过SVD计算协方差矩阵的特征值与特征向量。
4)对特征值从大到小排序,选择其中最大的k个。然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵。
5)将数据转换到k个特征向量构建的新空间中。
在PCA降维中,我们需要找到样本协方差矩阵的最大特征向量,然后用这最大的k个特征向量组成的矩阵来做低维投影降维。可以看出,在这个过程中需要先求出协方差矩阵,当样本数多、样本特征数也多的时候,这个计算量还是很大的。当我们用到SVD分解是分解协方差矩阵的时候,SVD有两个好处:
1)有一些SVD的实现算法可以先不求出协方差矩阵,也能求出我们的右奇异矩阵V。也就是说,我们的PCA算法可以不用做特征值分解而是通过SVD来完成,这个方法在样本量很大的时候很有效。实际上,sklearn的PCA算法的实现就是用的SVD,而不是特征值分解。
2)注意到PCA仅仅使用了SVD的左奇异值分解,没有使用右奇异值矩阵。左奇异矩阵可以用于对行数的压缩;右奇异矩阵可以用于对列(即特征维度)的压缩。这就是我们用SVD分解协方差矩阵实现PCA可以得到两个方向的PCA降维(即行和列两个方向)。
也就是说,左奇异矩阵可以用于对行数的压缩;右奇异矩阵可以用于对列(即特征维度)的压缩。这就是我们用SVD分解协方差矩阵实现PCA可以得到两个方向的PCA降维(即行和列两个方向)。
5.PCA的理论推导
PCA有两种通俗易懂的解释:(1)最大方差理论;(2)最小化降维造成的损失。这两个思路都能推导出同样的结果。
最大方差理论:在信号处理中认为信号具有较大的方差,噪声有较小的方差,信噪比就是信号与噪声的方差比,越大越好。样本在u1上的投影方差较大,在u2上的投影方差较小,那么可认为u2上的投影是由噪声引起的。因此我们认为,最好的k维特征是将n维样本点转换为k维后,每一维上的样本方差都很大。
PCA本质是:将方差最大的方向作为主要特征,并且在各个方向上将数据“离相关”,也就是让他们在不同正交方向上没有相关性。
6.PCA算法流程
(1)去平均值,即每一位特征减去各自的平均值;(中心化处理的原因:这些数字后继会参与到统计运算,比如求样本方差)
(2)计算协方差矩阵;
(3)计算协方差矩阵的特征向量和特征值;
(4)对特征值从大到小排序;
(5)保留最大的特征向量;
(6)将数据转换到个特征向量构建的新空间中
7.PCA算法实现的一般流程
(1)对数据进行归一化处理;
(2)计算归一化后的数据集的协方差矩阵;
(3)计算协方差矩阵的特征值和特征向量;
(4)保留最重要的k个特征(通常k要小于n);
(5)找出k个特征值相应的特征向量
(6)将m*n的数据集乘以k个n维的特征向量的特征向量(n*k),得到最后降维的数据。
8.PCA算法的应用场景
高维数据集的探索与可视化
数据压缩
图像、语音、通信的分析处理
降维(最主要),去除数据的冗余和噪声
9.PCA降维准则:
(1)最近重构性:样本集中所有点,重构后的点距离原来的点的误差之和最小。
(2)最大可分性:样本在低维空间的投影尽可能分开。
10.PCA算法的优缺点
优点:
1)仅仅需要以方差衡量信息量,不受数据集以外的因素影响。
2)各主成分之间正交,可消除原始数据成分之间的相互影响的因素。
3)计算方法简单,主要运算是特征值分解,易于实现。
缺点:
1)主成分各个特征维度的含义具有一定的模糊性,不如原始样本特征的解释性强。
因为PCA需要对数据进行预处理,第一步需要对其进行中心化,如果数据的尺度不统一,还需要标准化。通常的标准化的方式是除以标准差。这里可能就会出现一个问题,比如标准差很小,接近于0,尤其是被噪声污染的数据,噪声的标准差对数据的放大作用更显著,而没被噪声污染的数据其在标准化的过程中放大作用较小。
2)方差小的非主成分也可能含有对样本差异的重要信息,因降维丢弃可能对后续数据处理有影响。
3)PCA原理主要是为了消除变量之间的相关性,并且假设这种相关性是线性的,对于非线性的依赖关系则不能得到很好的结果。(可以使用KernelPCA)
4)PCA假设变量服从高斯分布,当变量不服从高斯分布(如均匀分布)时,会发生尺度缩放与旋转。
5)对降维最终得到的数目,也就是潜在的隐变量的数目,不能很好的估计。
为了克服PCA的一些缺点,出现了很多PCA的变种,比如为解决非线性降维的KPCA,还有解决内存限制的增量PCA方法Incremental PCA,以及解决稀疏数据降维的PCA方法Sparse PCA等。
PCA(主成分分析)和LDA(线性判别分析)有很多的相似点,其本质是要将初始样本映射到维度更低的样本空间中,但是PCA和LDA的映射目标不一样;PCA是为了让映射后的样本具有最大的发散性;而LDA是为了让映射后的样本有最好的分类性能。所以说PCA是一种无监督的降维方法,而LDA是一种有监督的降维方法。
下面我们总结下如何使用scikit-learn工具来进行PCA降维:
1. sklearn PCA介绍
在scikit-learn中,与PCA相关的类都在sklearn.decomposition包中。最常用的PCA类就是在scikit-learn中,我们下面主要也会讲解基于这个类的使用的方法。
除了PCA类以外,最常用的PCA相关类还有KernelPCA类,它主要用于非线性数据的降维,需要用到核技巧。因此在使用的时候需要选择合适的核函数并对核函数的参数进行调惨。
另外一个常用的PCA相关类是IncrementalPCA类,它主要是为了解决单机内存限制的。有时候我们的样本量可能是上百万+,维度可能也是上千,直接去拟合数据可能会让内存爆炸,此时我们可以用IncrementalPCA类来解决这个问题。IncrementalPCA先将数据分成多个batch,然后对每个batch依次递增调用partial_fit()函数,这样一步步的得到最终的样本最优降解。
此外还有SparsePCA和MiniBatchSparsePCA。他们和上面讲到的PCA类的区别主要是使用了L1的正则化,这样可以将很多非主要成分的影响度降为0,这样在PCA降维的时候我们仅仅需要对那些比较主要的成分进行PCA降维,避免了一些早上之类的因素对我们PCA降维的影响。SparsePCA和MIniBatchSparsePCA之间的区别则是MiniBatchSparsePCA通过使用一部分样本特征和给定的迭代次数来进行PCA降维,以解决在大样本时特征分解过慢的问题,当然,代价就是PCA降维的精确度可能会降低。使用SparsePCA和MiniBatchSparsePCA需要对L1正则化参数进行调参。
2. sklearn.decomposition.PCA参数介绍
下面我们主要基于sklearn.decomposition.PCA来讲解如何使用scikit-learn进行PCA降维。PCA类基本不需要调参,一般来说,我们只需要指定需要降维到的维度,或者我们希望降维后的主成分的方差和占原始维度所有特征方差和的比例阈值就可以了。
sklearn.decomposition.PCA的主要参数讲解:
1)n_components: 这个参数可以帮我们指定希望PCA降维后的特征维度数目(一般取前10个就可以获取大多数的特征)。最常用的做法是直接指定降维到的维度数目,此时n_components是一个大于等于1的整数。当然,我们也可以指定主成分的方差和所占的最小比例阈值,让PCA类自己去根据样本特征方差来决定降维到的维度数,此时n_components是一个(0,1]之间的数。当然,我们还可以将参数设置为"mle",此时PCA类会用MLE算法根据特征的方差分布情况自己去选择一定数量的主成分特征来降维。我们也可以用默认值,即不输入n_components,此时n_components=min(样本数,特征数)
2)whiten: 判断是否进行白化。所谓白化,就是对降维后的数据的每个特征进行归一化,让方差都为1.对于PCA降维本身来说,一般不需要白化。如果你PCA降维后有后续的数据处理动作,可以考虑白化。默认值是False,即不进行白化。
3)svd_solver: 即指定奇异值分解SVD的方法,由于特征分解是奇异值分解SVD的一个特例,一般的PCA库都是基于SVD实现的。有4个可以选择的值:{"auto","full","arpack","randomized"}。randomized一般适用于数据量大,数据维度多同时主成分数目比例又较低的PCA降维,它使用了一些加快SVD的随机算法。full则是传统意义上的SVD,使用了scipy库对应的实现。arpack和randomized的适用场景类似,区别是randomized的是sklearn自己的SVD实现,而arpack直接使用了scipy库的sparse SVD实现。默认是auto,即PCA类会自己去前面讲到的三种算法里面去权衡,选择一个合适的SVD算法来降维。一般来说,使用默认值就够了。
除了这些输入参数外,有两个PCA类的成员值得关注。第一个是explained_variance_,它代表降维后的各主成分的方差值。方差值越大,则说明越是重要的主成分。第二个是explained_variance_ratio_,它代表降维后的各主成分的方差值占总方差值的比例,这个比例越大,则越是重要的主成分。