一文读懂主成分分析

百家 作者:大数据文摘 2022-09-01 14:07:38
大数据文摘授权转载自数据派THU

主成分分析PCA(Principal Component Analysis)是一种常用的数据分析方法。PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维。

本文用直观和易懂的方式叙述PCA的基本数学原理,不会引入严格的数学推导。希望读者在看完这篇文章后能更好地明白PCA的工作原理。

一、降维概述

1.1 数组和序列(Series)的维度

对于数组和序列(Series)来说,维度就是shape()函数返回的结果,shape()函数中返回了几个数字,就是几维(也有人看array()开头或者结尾连续中括号的数量)。

不分行列的数组叫一维数组,此时shape返回单一的维度上的数据个数。有行列之分的数组叫二维数组,也称为表。一张表最多有二个维度,复数的表构成了更高维度的表。当一个数组中存在2张3行4列的表时,shape返回的是更高维度的行和列。当数组中存在2组2张3行4列的表时,数据就是4维,shape返回(2,2,3,4)。


数组中的每一张表,都可以是一个特征矩阵或一个DataFrame,这些结构永远只有一张表,所以一定有行列,其中行是样本,列是特征。针对每一张表,维度指的是样本的数量或特征的数量,一般无特别说明,指的都是特征的数量。除了索引之外,一个特征是一维,两个特征是二维,n个特征是n维。


1.2 图像中的维度

对图像来说,维度就是图像中特征向量的数量。特征向量可以理解为是坐标轴,一个特征向量定义一条直线,是一维;两个相互垂直的特征向量定义一个平面,即一个直角坐标系,就是二维;三个相互垂直的特征向量定义一个空间,即一个立体直角坐标系,就是三维;三个以上的特征向量相互垂直,定义人眼无法看见,也无法想象的高维空间。

1.3 降维解释

降维算法中的“降维”,指的是降低特征矩阵中特征的数量。降维的目的是为了让算法运算更快,效果更好,但其实还有另一种需求:数据可视化。图像和特征矩阵的维度是可以相互对应的,即一个特征对应一个特征向量,对应一条坐标轴。所以,三维及以下的特征矩阵,是可以被可视化的,这可以帮助我们很快地理解数据的分布,而三维以上特征矩阵的则不能被可视化,数据的性质也就比较难理解。

二、PCA概述

2.1 PCA入门

PCA(Principal Component Analysis)是一种常用的数据分析方法。PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维。

本节希望用直观和易懂的方式叙述PCA的基本数学原理,不引入严格的数学推导。希望读者在看完这篇文章后能更好地明白PCA的工作原理。

在降维过程中,会减少特征的数量,这意味着删除数据,数据量变少则模型可以获取的信息量会变少,模型的表现可能会因此受影响。同时,在高维数据中,必然有一些特征是不带有有效的信息的(比如噪音),或者有一些特征带有的信息和其他一些特征是重复的(比如一些特征可能会线性相关)。希望能够找出一种办法来帮助我们衡量特征上所带的信息量,在降维的过程中,生成既可以减少特征的数量,又保留大部分有效信息(将那些带有重复信息的特征合并,并删除那些带无效信息的特征等等)的新特征矩阵。

在特征选择方法中有一种方法是方差过滤,即如果一个特征的方差很小,则意味着这个特征上很可能有大量取值都相同,那这一个特征的取值对样本而言就没有意义(即不带有效信息)。从方差的这种应用可以推断出,如果一个特征的方差很大,则说明这个特征上带有大量的信息。因此,在降维中,PCA使用的信息量衡量指标就是样本方差,方差越大,特征所带的信息量越多。
 

Var代表一个特征的方差,n代表样本量,xi代表一个特征中的每个样本取值,代表这一列样本的均值。(方差计算公式中除的是n-1,是为了得到样本方差的无偏估计)

2.2 PCA降维过程

图1的示例中解释了主成分工作方法,其中实际数据显示在2D空间中,其中X轴和Y轴用于绘制数据。

图1 主成分分析的工作方法

图2说明了在拟合主组件后的外观。第一个主成分包含数据中的最大方差,第二个主成分正交于第一个主成分,因为我们知道所有的主成分都是互相正交的。我们可以用第一个主成分本身来表示整个数据。实际上,这便是用更少的维数表示数据的优势所在,可以节省空间,也可以获取数据中的最大方差,用于下一阶段的监督学习。这是计算主成分的核心优势。

图2  拟合主组件后的外观

为了方便可视化和理解,先来看一组简单的二维数据降维过程。

图3 二维数据降维过程

假设现在有一组简单的数据,有特征x1和x2,三个样本数据的坐标点分别为(1,1),(2,2),(3,3)。我们可以让x1和 x2分别作为两个特征向量,很轻松地用一个二维平面来描述这组数据。这组数据现在每个特征的均值都为2,方差则等于:
 

每个特征的数据一模一样,因此方差也都为1,数据的方差总和是2。现在我们的目标是:只用一个特征向量来描述这组数据,即将二维数据降为一维数据,并且尽可能地保留信息量,即让数据的总方差尽量靠近2。

于是,我们将原本的直角坐标系逆时针旋转45°,形成了新的特征向量x1*和x2*组成的新平面,在这个新平面中,三个样本数据的坐标点可以表示为(√2,0),(2√2,0),(3√2,0)。可以注意到,x2*上的数值此时都变成0,x2*的均值为0,x2*的方差也为0,因此x2*明显不带有任何有效信息。此时,x1*特征上的数据均值是2√2,而方差则可表示成:
 

此时,根据信息含量的排序,取信息含量最大的一个特征,因为我们想要的是一维数据,所以可以将x2*删除,同时也删除图中的x2*特征向量,剩下的x1*就代表了曾经需要两个特征来代表的三个样本点。通过旋转原有特征向量组成的坐标轴来找到新特征向量和新坐标平面,将三个样本点的信息压缩到了一条直线上,实现了二维变一维,并且尽量保留原始数据的信息。一个成功的降维,就实现了。

接下来,可以推广n维特征矩阵的降维步骤和方法:

第一步:输入原数据,结构为(m,n),找出原本的n个特征向量构成的n维空间V;
第二步:决定降维后的特征数量:k;
第三步:通过某种变化,找出n个新的特征向量,以及他们构成的新n维空间V*;
第四步:将原始数据映射到新的空间V*中;
第五步:选取前k个信息量最大的特征,删除没有被选中的特征,将n维空间降为k维。

在第三步中,我们用来找出n个新特征向量,让数据能够被压缩到少数特征上并且总信息量不损失太多的过程就是矩阵分解。PCA使用方差作为信息量的衡量指标,并且特征值分解来找出空间V。降维时,它会通过一系列数学推导(比如说,产生协方差矩阵)将特征矩阵X分解为以下三个矩阵,其中Q和Q-1是正交矩阵,P是一个对角矩阵(除了对角线上有值其他位置都是0的矩阵),其对角线上的元素就是方差。降维完成之后,PCA找到的每个新特征向量就叫做“主成分”,而被丢弃的特征向量被认为信息量很少,这些信息很可能就是噪音(降维算法的矩阵计算量比较大,运行比较缓慢)。


特别注意:

我们知道,PCA是将已存在的特征进行压缩,降维完毕后的特征不是原本的特征矩阵中的任何一个特征,而是通过某些方式组合起来的新特征。通常来说,在新的特征矩阵生成之前,我们无法知晓PCA都建立了怎样的新特征向量,新特征矩阵生成之后也不具有可解释性。新特征虽然带有原始数据的信息,却已经不是原数据上代表着的含义了。因此,以PCA为代表的降维算法是一种特征创造的方法。

所以,PCA一般不适用于探索特征和标签之间的关系的模型(如线性回归等),因为无法解释的新特征和标签之间的关系不具有意义。在线性回归模型中,一般使用特征选择。

2.3 PCA算法数学步骤

基于上述的总体理论讲述,接下来具体阐述“数学推导”中的算法步骤和过程。

设有m条n维数据:

1)将原始数据按列组成n行m列矩阵
2)将的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值得到新的矩阵X;
3)求出协方差矩阵
4)求出协方差矩阵的特征值及对应的特征向量;
5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵Q;
6)Y = QK即为降维到k维后的数据。

(这里的核心问题是协方差矩阵的特征值分解)

例题:已知现在有一个二维矩阵,如下所示,请降至一维。
 

解:

1)原始数据是两行五列矩阵,其中n=2,m=5;
2)这是一个已经去掉均值的矩阵。其中每一行是一个维度,而每一列是一个样本。去均值的运算是针对每一个维度进行的运算,也就是说每一行减去这一行的均值;
3)计算协方差矩阵P。

由于已经进行了去均值化,所以可以直接求取协方差矩阵。需要注意的是,协方差矩阵计算的是每一个维度之间的协方差,不是计算样本之间的协方差,所以本例中的协方差矩阵P为一个2×2的实对称矩阵。

(把C换成P)

4)协方差矩阵的特征值及对应的特征向量;

通过求解方程:


可以得到两个特征值,对应得到标准化的特征向量如下:


5)构建变换矩阵Q并降维;

到这里只需要将变换矩阵与原始矩阵相乘既可以完成降维的工作,在进行降维的过程中有两个容易出现的易错点。首先,特征向量的先后顺序要按照特征值的大小顺序进行排列;其次,如果原始数据的矩阵每一行是一个维度,每一列是一个样本的话,这个时候变换矩阵中的每一行是一个特征向量,如下变换矩阵Q。

(P换成Q)

同时,我们可以验证协方差矩阵P(实对称矩阵)的对角化。
 

6)最后用Q的第一行乘以X矩阵,就得到了降维后的表示:


降维投影结果如下图所示:
 
图4 降维投影结果

2.4 选择主成分个数(即k的值)

那么该如何选择k,即保留多少个PCA主成分呢?在上述简单的二维实验中,保留第一个成分看起来是自然的选择。对于高维度数据来说,k值的确定就比较复杂:如果k的值过大,数据压缩率不高,在极限情况 k = n 时,等于是在使用原始数据;相反地,如果k过小,那数据的近似误差太大。

决定k值时,通常会考虑不同k值可保留的方差百分比。具体来说,如果 k = n 时,那么得到的结果是对数据的完美近似,也就是保留了100%的方差,即原始数据的所有变化都被保留下来;相反,如果 k = 0 时,那等于是使用零向量来逼近输入数据,也就是只有0%的方差被保留下来。

一般而言,设c1,c2,…,cn表示协方差矩阵P的特征值(按由大到小顺序排列),使得cj为对应于特征向量的特征值。那么,如果我们保留前k个成分,则保留的方差百分比可以表示为:
 

2.5 sklearn中参数的解释

(1)n_components

在sklearn中,重要参数n_components是降维后的维度,即降维后需要保留的特征数量,降维流程中第二步里需要确认的k值,当参数n_components中不填写任何值,则默认返回min(X.shape)个特征,没有减少特征的个数。一般来说,不会使用这种输入方式。但却可以使用这种输入方式来画出累计可解释方差贡献率曲线,以此选择最好的n_components的取值。

累积可解释方差贡献率曲线是一条以降维后保留的特征个数为横坐标,降维后新特征矩阵捕捉到的可解释方差贡献率为纵坐标的曲线,能够帮助我们决定n_components最好的取值。

表示降维后每个新特征向量上所带的信息量大小(又叫可解释性方差,sklearn中用属性explained_variance_表示),表示特征向量所占的信息量占原始数据总信息量的百分比(又叫可解释方差贡献率,sklearn中用属性explained_variance_ratio_表示)。

除了输入整数,n_components还有哪些选择呢?数学大神Minka, T.P.找出了让PCA用最大似然估计自选超参数的方法,输入n_components=‘mle’作为n_components的参数输入,就可以调用这种方法。

输入[0,1]之间的浮点数,并且让参数svd_solver =‘full’,表示希望降维后的总解释性方差占比大于n_components指定的百分比,即是说,希望保留百分之多少的信息量。比如说,如果我们希望保留97%的信息量,就可以输入n_components=0.98,PCA会自动选出能够让保留的信息量超过97%的特征数量。

(2)重要参数svd_solver

在解释svd_solver参数之前,我们首先来阐述一下SVD算法,SVD和主成分分析PCA都属于矩阵分解算法的一部分,都是通过分解特征矩阵来进行降维。

SVD奇异值分解
若A是一个m*n的矩阵,且可用等式
 

进行表示,则该过程被称之为奇异值分解SVD。

中第i列的向量被称为关于的左奇异向量,中第i列的向量被称为关于的右奇异向量。

由上述分析可知,PCA的核心问题是协方差矩阵的特征值分解,SVD的核心问题在于对进行特征值分解。很明显,PCA和SVD所解决的问题非常相似,都是对一个实对称矩阵进行特征值分解。(实对称矩阵:如果有n阶矩阵A,其矩阵的元素都为实数,且矩阵A的转置等于其本身(,i和j为元素的脚标),则称A为实对称矩阵,实对称矩阵一定可以对角化)

讲完SVD算法,就有一个疑问了,参数svd_solver是奇异值分解器的意思,为什么PCA算法会有有关奇异值分解的参数?

我们之前曾经提到过,PCA和SVD涉及了大量的矩阵计算,两者都是运算量很大的模型,但其实SVD算法可以不计算协方差矩阵等复杂过程,直接求出新特征空间和降维后的特征矩阵。
 

简而言之,SVD在矩阵分解中的过程比PCA简单快速,虽然两个算法都走一样的分解流程,但SVD可以直接算出。但是SVD的信息量衡量指标比较复杂,“奇异值”理解起来也比“方差”来得困难。因此,sklearn将降维流程拆成了两部分:一部分是计算特征空间,由SVD完成,而矩阵U和Σ虽然会被计算出来,但完全不会被用到。另一部分是映射数据和求解新特征矩阵,由PCA完成,即之前PCA中Y = QX 的Q用来代替,实现了用SVD的性质减少计算量而信息量的评估指标是方差的目的。具体流程如下图:

图5  SVD矩阵分解流程

接下来,我们回归参数svd_solver的讲解。

参数svd_solver是在降维过程中,用来控制矩阵分解的一些细节的参数。有四种模式可选:"auto", "full", "arpack","randomized",默认”auto"。

auto
基于X.shape和n_components的默认策略来选择分解器:如果输入数据的尺寸大于500x500且要提取的特征数小于数据最小维度min(X.shape)的80%,就启用效率更高的randomized方法。否则,启用full方法精确完整的SVD将被计算,arpack截断将会在矩阵被分解完成后有选择地随机发生。
full
生成精确完整的SVD,适合数据量比较适中,计算时间充足的情况,生成的精确完整的SVD的结构为:

arpack
运行截断奇异值分解,分解时就将特征数量降到n_components中输入的数值k,可以加快运算速度,适合特征矩阵很大的时候,但一般用于特征矩阵为稀疏矩阵的情况,此过程包含一定的随机性质。截断后的SVD分解出的结构为:

randomized
适合特征矩阵巨大,计算量十分庞大的情况,要比“full”方法计算快很多。

(3)重要属性components_

通过SVD和PCA的合作,在矩阵分解时不使用PCA本身的特征值分解,而使用奇异值分解来减少计算量。sklearn实现了一种计算更快更简单,效果却很好的“合作降维“。在sklearn中,矩阵U和Σ虽然会被计算出来(同样也是一种比起PCA来说简化非常多的数学过程,不产生协方差矩阵),但完全不会被用到,也无法调取查看或者使用,因此我们可以认为,U和Σ在fit()之后就被遗弃了。奇异值分解追求的仅仅是,只要有了,就可以计算出降维后的特征矩阵。在transform()过程之后,fit()中奇异值分解的结果就并会被保存在属性components_当中,并可以调用查看。


结论

PCA是将已存在的特征进行压缩,降维完毕后的特征不是原本的特征矩阵中的任何一个特征,而是通过某些方式组合起来的新特征。在新的特征矩阵生成之前,无法知晓PCA都建立了怎样的新特征向量,新特征矩阵生成之后也不具有可解释性。新特征虽然带有原始数据的信息,却已经不是原数据上代表着的含义了。因此,以PCA为代表的降维算法是一种特征创造的方法。

PCA一般不适用于探索特征和标签之间的关系的模型(如线性回归等),因为无法解释的新特征和标签之间的关系不具有意义。在线性回归模型中,一般使用特征选择。

点「在看」的人都变好看了哦!

关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接