线性代数和概率统计在机器学习算法中被广泛应用,今天我们主要关注一种无监督机器学习算法:主成分分析PCA(Principal Component Analysis),并着重讲解PCA是如何应用线性代数进行数据降维。
PCA是从矩阵分析的角度出发,找出数据分布之间的关系,从而达到降低维度的目的,因此并不需要监督式学习中样本标签和特征之间的关系。
在解释PCA之前,我们先来回顾一下什么是特征的降维。在机器学习领域中,我们要进行大量的特征工程,把物品的特征转换成计算机所能理解的各种数据。通常,我们增加物品的特征,就有可能提升机器学习的效果。可是,随着特征数量不断的增加,特征向量的维度也会不断上升。这不仅会加大机器学习的难度,还会影响最终的准确度。针对这种情形,我们需要过滤掉一些不重要的特征,或者是把某些相关的特征合并起来,前者叫做特征选择,后者叫做特征合成,最终的目的是减少特征维度的同时,尽量保留原始数据所包含的信息。
对于今天要讲解的 PCA 方法。它的主要步骤其实并不复杂,但是为什么要这么做,你可能并不理解。咱们学习一个概念或者方法,不仅要能知其然,还要知其所以然,因此,我先从它的运算步骤入手,给你讲清楚每一步,然后再解释方法背后的核心思想。
我们使用一个矩阵来表示数据集。我们假设数据集中有 m 个样本、n 维特征,而这些特征都是数值型的,那么这个集合可以按照如下的方式来展示。
将数据集转换成矩阵的形式:
这个矩阵是 m×n 维的,其中每一行表示一个样本,而每一列表示一维特征。让我们把这个矩阵称作样本矩阵,现在,我们的问题是,能不能通过某种方法,找到一种变换,可以降低这个矩阵的列数,也就是特征的维数,并且尽可能的保留原始数据中有用的信息?
要解决这个问题,我们今天的主角PCA就要登场了,它提出了一种可行的解决方案,并且后续被广泛应用于数据降维场景,它的主要步骤包括:
①标准化样本矩阵中的原始数据;
②获取标准化数据的协方差矩阵;
③计算协方差矩阵的特征值和特征向量;
④依照特征值的大小,挑选主要的特征向量;
⑤生成新的特征。
下面我们分别来分析每一个步骤:
①标准化原始数据:
在机器学习中,数据标准化的目的是消除不同量纲引起的模型偏好,同时也能加快模型的收敛速度,在这里,只有标准化的特征才具有可比性,标准化的公式为:
其中 x 为原始值,u 为均值,σ 为标准差,x’ 是变换后的值。需要注意的是,这里标准化的数据是针对同一种特征,也是在同一个特征维度之内,也就是上面矩阵的同一列。不同维度的特征不能放在一起进行标准化。
②计算协方差矩阵:
首先,我们知道方差(Variance)是对随机变量偏离均值离散程度的度量,协方差是用于衡量两个变量的总体误差。假设两个变量分别是 x 和 y,而它们的采样数量都是 m,那么协方差的计算公式就是如下这种形式:
表示变量 x 的第 k 个采样数据, 表示这 k 个采样的平均值。而当两个变量是相同时,协方差就变成了方差。
表示样本矩阵 X 的第 1 列,表示样本矩阵 X 的第 2 列,依次类推。而 cov( , ) 表示第 1 列向量和自己的协方差,而 cov( ,) 表示第 1 列向量和第 2 列向量之间的协方差。结合之前协方差的定义,我们可以得知:
表示矩阵中第 k 行,第 i 列的元素。 表示第 i 列的平均值。
这样,我们就可以生成下面的协方差矩阵:
,)=cov(,),所以 COV 是个对称矩阵。另外,我们刚刚提到,对于 cov(,),如果 i=j,那么 cov(,) 也就是 这组数的方差。所以这个对称矩阵的主对角线上的值就是各维特征的方差。
③计算协方差矩阵的特征值和特征向量:
需要注意的是,这里所说的矩阵的特征向量,和机器学习中的特征向量(Feature Vector)完全是两回事。机器学习中的特征向量指的是物体的属性值集合,例如,房价预测中,房子的面积,房间数,距离地铁的距离等属性组成的一连串数字就叫做特征向量,矩阵的特征值和特征向量是线性代数中两个非常重要的概念。对于一个矩阵 X,如果能找到向量 v 和标量 λ,使得下面这个式子成立。
那么,我们就说 v 是矩阵 X 的特征向量,而 λ 是矩阵 X 的特征值。矩阵的特征向量和特征值可能不止一个。说到这里,你可能会好奇,特征向量和特征值表示什么意思呢?我们为什么要关心这两个概念呢?从几何的角度看,X是一种线性变换,特征向量v经过X的变换后,向量v只是被拉伸了λ倍,方向仍停留在原始直线上,也就是变换后仍停留在其张成的空间中。简单的来说,我们可以把向量 v 左乘一个矩阵 X 看做对 v 进行旋转或拉伸,而这种旋转和拉伸都是由于左乘矩阵 X 后,所产生的“运动”所导致的。特征向量 v 表示了矩阵 X 运动的方向,特征值 λ 表示了运动的幅度,这两者结合就能描述左乘矩阵 X 所带来的效果,因此被看作矩阵的“特征”。在 PCA 中的主成分,就是指特征向量,而对应的特征值的大小,就表示这个特征向量或者说主成分的重要程度。特征值越大,重要程度越高,我们要优先现在这个主成分,并利用这个主成分对原始数据进行变换。
现在,让我们先来看看给定一个矩阵,如何计算它的特征值和特征向量,并完成 PCA 分析的剩余步骤。我在下面列出了计算特征值的推导过程:
呢?根据我们之前学过的线性代数本质系列文章可知,v是非零向量,要想使得前面等式成立,(X−λI)对应的线性变换只能将向量v向更低的维度进行变换,可能压缩到一个面,一条线,或者是一个点,而矩阵的行列式值就代表变换前后面积的变化比例,所以只有det(X−λI)=0代表变换将v压缩到一个面,线或者点,则我们需要计算矩阵的行列式。
−λ)(−λ)…(−λ)+x1,2x2,3…xn−1,nxn,1+…)−(xn,1xn−1,2…x2,n−1x1,n)=0
最后,通过解这个方程式,我们就能求得各种λ的解,而这些解就是特征值。计算完特征值,我们可以把不同的λ值代入 λE−A,来获取特征向量。
④挑选主要的特征向量:
假设我们获得了 k 个特征值和对应的特征向量,那么我们就有:
Xv1=λ1v1
Xv2=λ2v2
…
Xvk=λkvk
按照所对应的λ数值的大小,对这 k 组的 v 排序。排名靠前的 v 就是最重要的特征向量。假设我们只取前 k1 个最重要的特征,那么我们使用这 k1 个特征向量,组成一个 n×k1 维的矩阵 D。把包含原始数据的 m×n 维矩阵 X 左乘矩阵 D,就能重新获得一个 m×k1 维的矩阵,达到了降维的目的。
那么,k1 取多少合适呢?一种常见的做法是,看前 k1 个特征值的和占所有特征值总和的百分比。假设一共有 10 个特征值,总和是 100,最大的特征值是 80,那么第一大特征值占整个特征值之和的 80%,我们认为它能表示 80% 的信息量,还不够多。那我们就继续看第二大的特征值,它是 15,前两个特征值之和有 95,占比达到了 95%,如果我们认为足够了,那么就可以只选前两大特征值,把原始数据的特征维度从 10 维降到 2 维。
下面我们用一个具体的矩阵示例,详细讲解每一步操作的过程和结果:
, 和 。
首先需要获取标准化之后的数据,需要注意的是,我们的分母都使用 m 而不是 m-1。
第一维特征的数据是 1,2,-3。平均值是 0,方差是
标准化之后第一维特征的数据是 1/2.16=0.463,2/2.16=0.926,-3/2.16=-1.389。以此类推,我们可以获得第二个维度和第三个维度标准化之后的数据。
最终标准化之后的矩阵是这样的:
接下来是协方差的计算。对于第 1 维向量的方差,有
第 1 维和第 2 维向量之间的协方差是
以此类推,我们就可以获得完整的协方差矩阵:
然后,我们要求解协方差矩阵的特征值和特征向量:
最后化简为:
所以 λ 有 3 个近似解,分别是 0、0.0777 和 4.4223。
根据特征值计算对应的特征向量,我们可以得到三个特征值及它们对应的特征向量:
找出特征值最大的特征向量,也就是最重要的主成分,然后利用这个主成分,对原始的样本矩阵进行变换。
很明显,最大的特征值是 4.422311507725755,对应的特征向量是[-0.58077228 -0.57896098 0.57228292]。变换后的样本矩阵是:
它从原来的 3 个特征维度降为 1 个特征维度了。
如果我把输出的主成分设置为 2,也就是说挑出前 2 个最重要的主成分。相应的,变化后的样本矩阵有 2 个特征维度。
第一个主成分包含了原始样本矩阵中的 98.27% 的信息,而第二个主成分包含了原始样本矩阵中的 1.73% 的信息,可想而知,最后一个主成分提供的信息量基本为 0 了,我们可以忽略不计了。
前面我们已经讲解了实现PCA的主要步骤,大家肯定有疑问:为什么要使用协方差矩阵?计算特征值和特征向量的作用又是什么?为什么选择特征值最大的主成分,就能涵盖最多的信息量呢?不用着急,接下来,我会给你做出更透彻的解释,让你不仅明白如何进行 PCA 分析,同时还明白为什么要这么做。
为什么要使用协方差矩阵?
为什么我们要使用样本数据中,各个维度之间的协方差,来构建一个新的协方差矩阵?要弄清楚这一点,首先要回到 PCA 最终的目标:降维。降维就是要去除那些表达信息量少,或者冗余的维度。
我们首先来看如何定义维度的信息量大小。这里我们认为样本在某个特征上的差异越大,那么这个特征包含的信息量就越大,就越重要。相反,信息量就越小,需要被过滤掉。很自然,我们就能想到使用某维特征的方差来定义样本在这个特征维度上的差异。
另一方面,我们要看如何发现冗余的信息。如果两种特征是有很高的相关性,那我们可以从一个维度的值推算出另一个维度的值,所表达的信息就是重复的。在概率和统计模块,我介绍过多个变量间的相关性,而在实际运用中,我们可以使用皮尔森(Pearson)相关系数,来描述两个变量之间的线性相关程度。这个系数的取值范围是 [−1,1],绝对值越大,说明相关性越高,正数表示正相关,负数表示负相关。
我使用下面这张图,来表示正相关和负相关的含义。左侧 X 曲线和 Y 曲线有非常近似的变化趋势,当 X 上升 Y 往往也是上升的,X 下降 Y 往往也下降,这表示两者有较强的正相关性。右侧 X 和 Y 两者相反,当 X 上升的时候,Y 往往是下降的,X 下降的时候,Y 往往是上升,这表示两者有较强的负相关性。
皮尔森系数计算公式如下:
和 分别为两个特征维度 i 和 j 在第 k 个采样上的数值。 和 分别表示两个特征维度上所有样本的均值,σx 和 σy 分别表示两个特征维度上所有样本的标准差。
我把皮尔森系数的公式稍加变化,你来观察一下皮尔森系数和协方差之间的关系。
你看,变换后的分子不就是协方差吗?而分母类似于标准化数据中的分母。所以在本质上,皮尔森相关系数和数据标准化后的协方差是一致的。
考虑到协方差既可以衡量信息量的大小,也可以衡量不同维度之间的相关性,因此我们就使用各个维度之间的协方差所构成的矩阵,作为 PCA 分析的对象。就如前面所讲述的,这个协方差矩阵主对角线上的元素是各维度上的方差,也就体现了信息量,而其他元素是两两维度间的协方差,也就体现了相关性。既然协方差矩阵提供了我们所需要的方差和相关性,那么下一步,我们就要考虑对这个矩阵进行怎样的操作了。
为什么要计算协方差矩阵的特征值和特征向量?
关于这点,我们可以从两个角度来理解。
第一个角度是对角矩阵。所谓对角矩阵,就是说只有矩阵主对角线之上的元素有非 0 值,而其他元素的值都为 0。我们刚刚解释了协方差矩阵的主对角线上,都是表示信息量的方差,而其他元素都是表示相关性的协方差。既然我们希望尽可能保留大信息量的维度,而去除相关的维度,那么就意味着我们希望对协方差进行对角化,尽可能地使得矩阵只有主对角线上有非 0 元素。假如我们确实可以把矩阵尽可能地对角化,那么对角化之后的矩阵,它的主对角线上元素就是、或者接近矩阵的特征值,而特征值本身又表示了转换后的方差,也就是信息量。而此时,对应的各个特征向量之间是基本正交的,也就是相关性极低甚至没有相关性。
第二个角度是特征值和特征向量的几何意义。在向量空间中,对某个向量左乘一个矩阵,实际上是对这个向量进行了一次变换。在这个变换的过程中,被左乘的向量主要发生旋转和伸缩这两种变化。如果左乘矩阵对某一个向量或某些向量只发生伸缩变换,不对这些向量产生旋转的效果,那么这些向量就称为这个矩阵的特征向量,而伸缩的比例就是特征值。换句话来说,某个矩阵的特征向量表示了这个矩阵在空间中的变换方向,这些方向都是趋于正交的,而特征值表示每个方向上伸缩的比例。如果一个特征值很大,那么说明在对应的特征向量所表示的方向上,伸缩幅度很大。这也是为什么,我们需要使用原始的数据去左乘这个特征向量,来获取降维后的新数据。因为这样做可以帮助我们找到一个方向,让它最大程度地包含原有的信息。需要注意的是,这个新的方向,往往不代表原始的特征,而是多个原始特征的组合和缩放。