PCA是一种统计技术,经常应用于人面部识别和图像压缩以及信号去噪等领域,是在高维数据中提取模式的一种常用技术。要了解PCA首先要了解一些相关的数学知识,这里主要介绍协方差矩阵、特征值与特征矢量的概念。
1、 协方差矩阵
协方差总是在两维数据之间进行度量,如果我们具有超过两维的数据,将会有多于两个的协方差。例如对于三维数据(x, y, z维),需要计算cov(x,y),cov(y,z)和cov(z,x)。获得所有维数之间协方差的方法是计算协方差矩阵。维数据协方差矩阵的定义为
(1)
这个公式告诉我们,如果我们有一个n维数据,那么协方差矩阵就是一个n行n列的方矩阵,矩阵的每一个元素是两个不同维数据之间的协方差。
对于一个3维数据(x,y,z),协方差矩阵有3行3列,它的元素值为:
(2)
需要注意的是:沿着主对角线,可以看到元素值是同一维数据之间的协方差,这正好是该维数据的方差。对于其它元素,因为cov(a,b)=cov(b,a),所以协方差矩阵是关于主对角线对称的。
2、特征值和特征矢量
只要矩阵大小合适,就可以进行两矩阵相乘,特征矢量就是其中的一个特例。考虑图2.1中两个矩阵和矢量乘法。
图2.1 一个非特征矢量和一个特征矢量的例子
图2.2 一个缩放的特征矢量仍然是一个特征矢量
在第一个例子中,结果矢量不是原来因子矢量与整数相乘,然而在第二个例子中,结果矢量是原来因子矢量的4倍,为什么会这样呢?该矢量是一个2维空间矢量,表示从原点(0,0)指向点(3,2)的箭矢。方矩阵因子可以看作是转换矩阵,一个矢量左乘该转换矩阵,意味着原始矢量转换为一个新矢量。
特征矢量来自于转换特性。设想一个转换矩阵,如果用其左乘一个矢量,映射矢量是它自身,这个矢量(以及它的所有尺度缩放)就是该转换矩阵的特征矢量。
特征矢量有什么特性呢?首先只有方阵才有特征矢量,而且并不是所有方阵都有特征矢量,如果一个nXn方阵有特征矢量,那么它有n个特征矢量。
特征矢量的另外一个性质是对特征矢量的缩放会得到缩放前同样地结果,如图2.2所示,这是因为你对矢量的缩放只是改变它的长度,不会改变它的方向。最后,矩阵的所有特征矢量是正交的。这是一个非常重要的性质,因为这意味着你可以在这些正交矢量上表示一组数据,而不仅是在x和y轴上。在下面的PCA小节内我们将作这个工作。
另外一个需要了解的是数学家寻找特征矢量,总喜欢寻找长度为1的那一个特征矢量,这是因为矢量的长度不影响它是否是特征矢量,因此,为了保证特征矢量是标准的矢量,我们通常将特征矢量的长度缩放为1,从而所有的特征矢量都有相同的长度。
怎样去找到这些神秘的特征矢量呢?不幸的是,只有对相当小维数的矩阵才有简单地方法,比如不超过3X3,对于较大维数的矩阵,需要复杂的迭代算法。
特征值是与特征矢量极其相关的,事实上,在图2.1中我们已经看到了一个特征值。注意在两个例子中,原始矢量左乘方阵后与矢量缩放数一样。在这个例子中,缩放数为4。4就是对应该特征矢量的特征值。不管在左乘方阵之前如何缩放特征矢量,我们总是得到该矢量的4倍(如图2.2)。所以特征值和特征矢量总是成对出现,当你使用程序计算特征矢量时,你总是同时得到对应的特征值。
3、主成分分析(PCA)
最后我们将进行主成分分析的介绍,那么什么是主成分分析呢?它是一种在数据中辨别模式的方法,表达数据的相似与不同之处的方法。因为高维数据的模式难以发现——图形表述不可用,PCA是一个有力的数据分析工具。
PCA的另外一个重要优势是,一旦你找到了数据的这些模式,你可以压缩它,也就是在不丢失很多信息的基础上,降低数据的维数。在下一节将会看到,这种技术被用于图像压缩。
本节将一步一步地带你对一组数据进行PCA操作。我将不具体描述该技术为什么适用,只是介绍怎样使用该技术。
§3.1 方法
第一步:获得数据
在我简单的例子中,将使用我自己制作的2维数据,使用2维数据的原因是我可以提供这些数据的图形,以便直观地观察PCA的操作步骤。下面就是我使用的数据
x=[2.5, 0.5, 2.2, 1.9, 3.1, 2.3, 2, 1, 1.5, 1.1]T
y=[2.4, 0.7, 2.9, 2.2, 3.0, 2.7, 1.6, 1.1, 1.6, 0.9]T
第二步:减去均值
要使PCA正常工作,必须减去数据的均值。减去的均值为每一维的平均,所有的x值都要减去,同样所有的y值都要减去,这样处理后的数据都具有0均值。
x=[0.69, -1.31, 0.39, 0.09, 1.29, 0.49, 0.19, -0.81, -0.31, -0.71]T
y=[0.49, -1.21, 0.99, 0.29, 1.09, 0.79, -0.31, -0.81, -0.31, -1.01]T;
第三步:计算协方差矩阵
因为数据是2维的,它的协方差矩阵就是2X2维的,这里直接给出结果:
因为非对角元素是正的,我们可以期望 和 变量一起增大。
第四步:计算协方差矩阵的特征矢量和特征值
因为协方差矩阵为方阵,我们可以计算它的特征矢量和特征值,它可以告诉我们数据的有用信息。我们数据的特征值和特征矢量分别为
我们可以看到这些矢量都是单位矢量,也就是它们的长度为1,这对于PCA是非常重要的,幸运的是,大多数数学程序包,当你计算特征矢量时,总是会得到单位特征矢量。
第五步:选择成分组成模式矢量
现在可以进行数据压缩降低维数了。如果你观察上一节中的特征矢量和特征值,会注意到那些特征值是十分不同的。事实上,可以证明对应最大特征值的特征矢量就是数据的主成分。在我们的例子中,对应大特征值的特征矢量就是那条穿过数据中间的矢量,它是数据维数之间最大的关联。
一般地,从协方差矩阵找到特征矢量以后,下一步就是按照特征值由大到小进行排列,这将给出成分的重要性级别。现在,如果你喜欢,可以忽略那些重要性很小的成分,当然这会丢失一些信息,但是如果对应的特征值很小,你不会丢失很多信息。如果你已经忽略了一些成分,那么最后的数据集将有更少的维数,精确地说,如果你的原始数据是n维的,你选择了前p个主要成分,那么你现在的数据将仅有p维。
现在要做的是你需要组成一个模式矢量,这只是几个矢量组成的矩阵的一个有意思的名字而已,它由你保持的所有特征矢量构成,每一个特征矢量是这个矩阵的一列。
对于我们的数据集,因为有两个特征矢量,因此我们有两个选择。我们可以用两个特征矢量组成模式矢量:
我们也可以忽略其中较小特征值的一个特征矢量:
下一节我们将会看到它们的结果。
x=[-0.828, 1.778, -0.992, -2.742, -1.676, -0.913, 0.099, 1.145, 0.438,1.224]T
第六步:获得新数据
这是PCA最后一步,也是最容易的一步。一旦你选择了须要保留的成分(特征矢量)并组成了模式矢量,我们简单地对其进行转置,并将其左乘原始数据的转置:
其中rowFeatureVector是由特征矢量作为列组成的矩阵的转置,因此它的行就是原来的特征矢量,而且对应最大特征值的特征矢量在该矩阵的最上一行。rowdataAdjust是减去均值后的数据,即数据项目在每一列中,每一行就是一维。FinalData是最后得到的数据,数据项目在它的列中,维数沿着行。
这将给我们什么结果呢?这将仅仅给出我们选择的数据。我们的原始数据有两个轴(x和y),所以我们的原始数据按这两个轴分布。我们可以按任何两个我们喜欢的轴表示我们的数据。如果这些轴是正交的,这种表达将是最有效的,这就是特征矢量总是正交的重要性。我们已经将我们的数据从原来的xy轴表达变换为现在的单个特征矢量表达。如果我们已经忽略了一些特征矢量,则新数据将会用我们保留的矢量表达。
§3.2 恢复原来的数据
4、写的累了,就这样吧。