当前位置: 首页 > 科技观察

从特征分解到协方差矩阵:PCA算法详解与实现

时间:2023-03-13 00:47:08 科技观察

本文首先简单介绍了特征向量及其与矩阵的关系,然后讲解了协方差矩阵的基本概念和基于它的主成分分析方法的概念,***我们结合协方差矩阵和主成分分析来实现数据降维。本文不仅从理论上解释了各种重要概念,而且还一步一步地使用Python实现了数据降维。首先,本文中的特征向量是数学概念中的特征向量,而不是输入特征值组成的向量。在数学上,线性变换的特征向量是一个非退化向量,其方向在变换下不会改变。在此变换下,此向量缩放的比例称为特征值。一个线性变换通常可以用它的特征值和特征向量来完整描述。如果我们将矩阵视为物理运动,那么最重要的是运动的方向(特征向量)和速度(特征值)。因为物理运动只能用方向和速度来描述,所以矩阵也可以只用特征向量和特征值来描述。其实在线性代数中,矩阵就是由各种标量或变量组成的表格,与Excel表格没有本质区别。只是矩阵之间的一些运算是用数学定义的。矩阵运算的规则与实际的内部值无关,只是定义运算时需要在哪些位置进行哪些运算。因为矩阵相当于定义了一系列算法的表,所以实际上相当于一个变换。这种变换(物理运动)完全可以用特征向量(方向)和特征值(速度)来描述。线性变换在解释线性变换之前,我们需要了解什么是矩阵运算。矩阵之所以高效有用,是因为我们可以统一地对矩阵中的值进行加法或乘法等运算。如下图,如果我们将向量v左乘矩阵A,得到一个新的向量b,也就是说,可以说矩阵A对输入向量v进行了一次线性变换,线性变换的结果为B。因此,矩阵运算Av=b表示向量v经过一个变换得到向量b(矩阵A)。以下示例显示了矩阵乘法(这种类型的乘法称为点积)的工作原理:因此矩阵A将向量v转换为向量b。下图展示了矩阵A如何将一个更短更低的向量v映射到一个更长更高的向量b:我们可以将其他正向量喂入矩阵A,每一个喂入的向量都会被投影到一个新的空间并指向右侧变为更高更长。假设所有的输入向量V都可以排成一个标准的表,即:矩阵可以将所有的输入向量V投影到一个新的空间如下图,即所有输出向量组成的B:输入向量空间可以是下图中看到与输出向量空间的关系,如果把矩阵假设为一阵风,可以通过有形的力产生可见的结果。而这阵风吹来的方向就是特征向量,所以特征向量表示矩阵要变换的方向。正如您在上图中看到的,特征向量没有改变方向,它已经指向矩阵想要将所有输入向量推向的方向。因此,特征向量的数学定义是:存在一个非零矩阵A和一个标量λ,如果存在一个向量x并满足如下关系,则x为特征向量,λ为特征值。特征向量也是线性变换的不变轴,所有输入向量都沿着该轴被压缩或拉伸。线性变换中的线性度只是表示变换沿线性轴的特性。一般来说,多阶方阵有多个特征向量,比如3*3矩阵有3个特征向量,n阶方阵有n个特征向量,每个特征向量代表一维线性变换的方向。由于特征向量提取了矩阵变换的主要信息,因此在矩阵分解中非常重要,即将矩阵沿特征向量对角化。因为这些特征向量代表矩阵的重要属性,所以它们可以执行与深度神经网络中的自动编码器类似的任务。引用YoshuaBengio的话:许多数学对象可以通过将它们分解为更基本的组成部分来更好地理解,因为我们发现了它们的一些一般属性,而不是我们选择用来表征它们的属性。例如,整数可以分解为质因数。虽然我们表示整数的方式会根据我们使用的是二进制还是十进制而改变,但是整数总是可以用几个质因数来表示(比如12=2×2×3),所以这种分解的性质就是稳定性我们需要。我们可以将一个整数分解成素因子以获得它的自然属性,我们也可以分解一个矩阵来获得它的函数属性,而当矩阵表示为多组元素的数组时,这种属性信息并不明显。最常见的矩阵分解是特征分解(eigen-decomposition),也就是我们把矩阵分解成一系列的特征向量和特征值。主成分分析(PCA)PCA是一种用于在高维数据(图像等)中查找模式的工具。机器学习实践通常使用PCA来预处理输入神经网络的数据。PCA算法通过对数据进行聚合、旋转和缩放,可以去除一些低方差的维度,实现降维。该操作可以提高神经网络的收敛速度和整体效果。为了进一步理解PCA算法,我们还需要定义一些基本的统计概念,即均值、标准差、方差和协方差。样本均值可以简单表示为所有样本X的均值,如下图,样本均值表示为:样本标准差是样本方差的平方根。即每个样本点与样本均值之间的平均距离。n个样本的方差只除以n-1,因为样本只是真实分布的估计量,而样本方差只是真实方差的估计量。大学教材概率论和数理统计证明,如果除以n(二阶中心矩),那么样本方差是真实方差的一致估计,但不是无偏估计,即有样本方差的系统偏差。因此,我们需要调整二阶中心矩来消除系统偏差。如下图,样本标准差s和方差var(X)都是无偏估计:因为样本标准差和方差都是先平方再平方,所以距离一定是正的,不会抵消。假设我们有以下数据点(散点图):像线性回归这样的PCA将尝试通过所有数据点构建一条可解释性直线。每条直线代表一个“主成分”或自变量与因变量之间的关系。数据的维数就是主成分的个数,即每个数据点的特征维数。PCA的作用是分析这些特征并选择最重要的特征。PCA本质上是以方差最大的方向为主要特征,对每个正交方向的数据进行“减量”,即使它们在不同的正交方向上不相关。通常我们认为信息的方差大,而噪声的方差小,信噪比就是信号与噪声的方差比,所以我们希望投影数据的方差越大,更好的。因此,我们认为最好的k维特征是将n维样本点转换为k维后,每个维度的样本方差都非常大。如下图所示,第一主成分将散点图以直线(红色)的形式分成两条边,并保留了第一个方差。因为投影到这条直线(红色)上的数据点与均值(空心点)有***方差,即所有蓝色点到灰线的平均距离为***方差,所以这个主成分会保留最多的信息。如上图,假设第二主成分是与红线(第一主成分)垂直的灰线。当数据点投影到第二主成分上时,它们与样本均值(空心点)的方差非常小,即数据点到红线的平均距离。所以红线是头发的主要成分。协方差矩阵我们已经了解到,矩阵实际上是一种将一个向量转换为另一个向量的方法。此外,我们还可以把矩阵看成是作用在所有数据上并向一定方向运动的力。同时,我们也知道变量之间的相关性可以用方差和协方差来表示,我们希望保留最大的方差来达到最大程度的降维。因此,我们希望方差和协方差可以统一表示,都可以用内积的形式表示,而内积与矩阵乘法密切相关。所以我们可以用矩阵乘法的形式来表示。如果输入矩阵X有两个特征a和b,一共有m个样本,那么:如果我们从左边乘以X的转置,那么我们可以得到协方差矩阵:这个矩阵对角线上的两个matrix的元素分别是两个特征的方差,而其他元素是a和b的协方差。两者统一成一个矩阵,所以我们可以用协方差矩阵来描述数据点之间的方差和协方差,即凭经验描述我们观察到的数据。求协方差矩阵的特征向量和特征值,相当于拟合一条保持最大方差的直线或主成分。因为特征向量跟踪主成分的方向,所以最大方差和协方差的轴显示数据最倾向于变化的方向。根据上面的推导,我们发现达到优化目标相当于将协方差矩阵对角化:即除对角线外的其他元素均为0,特征值在对角线上从上到下排列。作为实对称矩阵,协方差矩阵的主要性质之一是可以正交对角化,因此必须分解为特征向量和特征值。当协方差矩阵分解为特征向量和特征值时,特征向量代表变换方向,特征值代表尺度。在这种情况下,特征值描述了数据之间的协方差。我们可以把特征向量按照特征值的大小降序排列,这样我们就得到了主成分的重要性。对于2阶方阵,协方差矩阵可能如下所示:在上面的协方差矩阵中,1.07和0.64分别代表变量x和y的方差,而次对角线上的0.63代表变量x和y之间的协方差。由于协方差矩阵是实对称矩阵(即Aij=Aji),所以必须通过正交化类似地对角化。因为这两个变量的协方差是正的,所以这两个变量的分布是正相关的。如下图所示,如果协方差为负,那么变量是负相关的。请注意,如果变量之间的协方差为零,则变量不相关且不存在线性关系。因此,两个变量的协方差越大,相关性越大,投影到主成分后的损失越小。同时,我们可以考虑协方差和方差的计算公式来理解它们的关系:计算协方差的好处是我们可以通过正值、负值或零值来考察高维空间中两个变量之间的关系协方差。一般来说,协方差矩阵定义了数据的形状,协方差决定了沿对角线对称分布的强度,方差决定了沿x轴或y轴对称分布的趋势。基变换由于协方差矩阵的特征向量是相互正交的,所以该变换相当于将主成分的x轴和y轴的两个基轴替换为一个基轴。也就是将数据集的坐标系重新变换到一个新的以主成分为基轴的空间中。当然,这些主成分保留了最大方差。我们上面提到的x轴和y轴称为矩阵的基,即矩阵的所有值都是在这两个基上度量的。但是矩阵的底是可以改变的,通常一组特征向量可以组成一组矩阵的不同底坐标,原矩阵的元素可以用这组新的底来表示。在上图中,我们展示了同一个向量v如何在不同的坐标系中有不同的表达方式。黑色实线代表x-y轴坐标系,红色虚线是另一个坐标系。在第一个坐标系中v=(1,1),在第二个坐标系中v=(1,0)。所以矩阵和向量可以在不同的坐标系下进行等价变换。在数学上,n维空间没有唯一描述,因此等价变换矩阵的基础可能会使问题更容易解决。***我们简单总结一下PCA算法的基本概念和步骤:首先,我们要明白一个矩阵相当于一个变换,变换的方向是特征向量,变换的尺度是特征值。PCA的本质就是以方差最大的方向为主要特征,对各个正交方向的数据进行“减量”,即使它们在不同的正交方向上不相关。因此,我们希望将最相关的特征投影到一个主成分上,以实现降维。投影的标准是保留最大方差。在实际操作中,我们希望计算特征之间的协方差矩阵,通过协方差矩阵的特征分解得到特征向量和特征值。如果我们把特征值从大到小排列,对应的特征向量组成的矩阵就是我们降维后需要的数据。下面我们将逐步实现PCA算法。输入数据:importnumpyasnpx=np.array([2.5,0.5,2.2,1.9,3.1,2.3,2,1,1.5,1.1])y=np.array([2.4,0.7,2.9,2.2,3,2.7,1.6,1.1,1.6,0.9])标准化数据:mean_x=np.mean(x)mean_y=np.mean(y)scaled_x=x-mean_xscaled_y=y-mean_ydata=np.matrix([[scaled_x[i],scaled_y[i]]foriinrange(len(scaled_x))])绘制散点图查看数据分布:importmatplotlib.pyplotaspltplt.plot(scaled_x,scaled_y,'o')求协方差矩阵:cov=np.cov(scaled_x,scaled_y)求协方差矩阵的特征值和特征向量:eig_val,eig_vec=np.linalg.eig(cov)求出特征向量后,我们需要选择降维后的数据维度k(n维数据降维到k维数据),但是我们的数据只有两个维度,所以我们只能删除一个维度:eig_pairs=[(np.abs(eig_val[i]),eig_vec[:,i])foriinrange(len(eig_val))]eig_pairs.sort(reverse=True)feature=eig_pairs[0][1]变换得到降维数据:new_data_reduced=np.transpose(np.dot(feature,np.transpose(data))原文:https://deeplearning4j.org/eigenvector#a-beginners-guide-to-eigenvectors-pca-covariance-and-entropy【本文为原文翻译《机器之心》专栏作者微信公众号《机器之心(id:almosthuman2014)》】点这里,阅读更多作者好文