一:引入问题
首先看一个表格,下表是某些学生的语文,数学,物理,化学成绩统计:
首先,假设这些科目成绩不相关,也就是说某一科目考多少分与其他科目没有关系,那么如何判断三个学生的优秀程度呢?首先我们一眼就能看出来,数学,物理,化学这三门课的成绩构成了这组数据的主成分(很显然,数学作为第一主成分,因为数据成绩拉的最开)。
那么为什么我们能一眼看出来呢?
当然是我们的坐标轴选对了!!
下面,我们继续看一个表格,下标是一组学生的数学,物理,化学,语文,历史,英语成绩统计:
那么这个表我们能一眼看出来吗?
数据太多了,以至于看起来有些凌乱,无法直接看出这组数据的主成分,因为在坐标系下这组数据分布的很散乱。究其原因,是因为无法拨开遮住肉眼的迷雾,如果把这些数据在相应的空间中表示出来,也许你就能换一个观察角度找出主成分,如下图所示:
简单的二维或者三维我们可以想象出来其分布状态,那么对于更高维的数据,能想象出来其分布吗?还有,就算能描述分布,如何精确地找到这些主成分的轴?如何衡量你提取的主成分到底占了整个数据的多少信息?所以,我们就要用到主成分分析的处理方法。
为了说明什么是数据的主成分,我们首先得了解数据降维,数据降维时怎么回事?
二,数据降维
假设三维空间中有一系列点,这些点分布在一个过原点的斜面上,如果你用自然坐标x,y,z这三个轴来表示这组数据的话,需要使用三个维度,而事实上,这些点的分布仅仅是在一个二维的平面上,那么问题出在哪里?如果你仔细想想,能不能把x,y,z坐标系旋转一下,使数据所在平面与x,y平面重合?这就对了!如果把旋转后的坐标记为x',y',z',那么这组数据的表示只用x'和y'两个维度表示即可!
当然了,如果想恢复原来的表示方式,那就得把这两个坐标之间的变换矩阵存下来。这样就能把数据维度降下来了!但是,我们要看到这个过程的本质,如果把这些数据按行或者按类排成一个矩阵,那么这个矩阵的秩就是2!这些数据之间是有相关性的,这些数据构成的过原点的向量的最大线性无关组包含2个向量,这就是为什么一开始就假设平面过原点的原因!
那么如果不过原点呢?这就是数据中心化的缘故!将坐标原点平移到数据中心,这样原本不相关的数据在这个新坐标系中就有相关性了!有趣的是,三点一定共面,也就是三维空间中任意三点中心化后都是线性相关的,一般来讲n维空间中n个点一定能在一个n-1维子空间中分析!
总结一下这个例子,数据降维后并没有丢弃任何东西,因为这些数据在平面以外的第三个维度的分量都为0。现在,假设这些数据在z'轴有一个很小的抖动,那么我们仍然用上述的二维表示这些数据,理由是我们可以认为这两个轴的信息是数据的主成分,而这些信息对于我们的分析已经足够了,z'轴上的抖动很有可能是噪音,也就是说本来这组数据是有相关性的,噪声的引入,导致了数据不完全相关,但是,这些数据在z'轴上的分布与原点构成的夹角非常小,也就是说在z'轴上有很大的相关性,综合考虑,就可以认为数据在x',y'轴上的投影构成了数据的主成分!
所以说,降维肯定意味着信息的丢失,不过鉴于实际数据本身常常存在的相关性,我们可以想办法在降维的同时将信息的损失尽量降低。
下面在说一个极端的情况,也许在现实中不会出现,但是 类似的情况还是很常见的。
假设某学籍数据有两列M和F,其中M列的取值是如果此学生为男性,则取值为1,为女性则取0;而F列是学生为女性,则取值为0,男性则为1.此时如果我们统计全部学籍数据,会发现对于任何一条记录来说,当M为1时F必定为0,反之当M为0时F必定为1,在这种情况下,我们将M或者F去掉实际上没有任何信息的损失,因为只要保留一列就可以完全还原另一列。
那么降维我们差不多说清楚了,现在我们将自己面对的数据抽象为一组向量,那么下面我们有必要研究一些向量的数学性质,而这些数学性质将成为后续推导出PCA的理论基础。
三,PCA基本数学原理
3.1 内积与投影
下面先看一个向量运算:内积。
两个维数相同的向量的内积被定义为:
内积运算将两个向量映射为一个实数,其计算方式非常容易理解,但是其意义并不明显,下面我们分析内积的几何意义。假设A和B是两个n维向量,我们知道n维向量可以等价表示为n维空间中的一条从原点发射的有向线段,为了简单期间,我们假设A和B均为二维向量,则
那么在二维平面上A和B可以用两条发自原点的有向线段表示,如下图:
现在我们从A点向B所在直线引入一条垂线,我们知道垂线与B的交点叫做A在B上的投影,再假设A与B的夹角为a,则投影的矢量长度为
其中
是向量A的模,也就是A线段的标量长度。
注意这里区分了矢量长度和标量长度,标量长度总是大于等于0,值就是线段的长度;而矢量长度可能为负,其绝对值是线性长度,而符号取决于其方向与标准方向相同或者相反。
可能大家还没明白内积和这个东西有什么关系,不过我们将内积表示为另一种我们熟悉的方式:
现在明白了点吧,A与B的内积等于A到B的投影长度乘以B的模,在进一步,如果我们假设B的模为1,即让
,那么就变成了下面公式(也就是上面我们说的投影的矢量长度):
也就是说,设向量B的模为1,则A与B的内积值等于A向B所在直线投影的矢量长度!这就是内积的一种几何解释,也就是我们得到的第一个重要结论。
3.2 基
下面我们继续在二维空间讨论向量,上文说过,一个二维向量可以对应二维笛卡尔直角坐标系中从原点出发的一条有向线段,例如下面这个向量:
在代数表示方面,我们经常使用线段终点的点的坐标表示向量,例如上面的向量可以表示为(3,2),这里我们再熟悉不过的向量表示。
不过我们常常忽略,只有一个(3,2)本身是不能够精确表示一个向量的,我们仔细看一下,这里的坐标(3,2)实际上表示的是向量在x轴上的投影值3,在y轴上的投影值为2。也就是说我们使其隐式引入一个定义:以x轴和y轴上正方向长度为1的向量为标准,那么一个向量(3,2)实际上是说在x轴投影为3而y轴投影为2.注意投影是一个矢量,所以可以为负。
更正式的说,向量(x,y)实际上表示线性组合:
不难证明所有二维向量都可以表示为这样的线性组合,此处(1,0)和(0,1)叫做二维空间的一组基。
所以,要准确描述向量,首先要确定一组基,然后给出基所在的各个直线上的投影值,就可以了,只不过我们经常省略第一步,而默认以(1,0)和(0,1)为基。
我们之所以默认选择(1,0)和(0,1)为基,当然是比较方便,因为他们分别是x和y轴正方向上的单位向量,因此就使得二维平面上点坐标和向量一一对应,非常方便。但实际上任何两个线性无关的二维向量都可以成为一组基,所谓线性无关在二维平面内可以直观认为是两个不再一条直线上的向量。
例如,(1,1)和(1,-1)也可以成为一组基。一般来说,我们希望基的模是1,因为从内积的意义可以看到,如果基的模式1,那么就可以方便的用向量点乘基而直接获得其在新基上的坐标了!实际上,对应于任何一个向量我们总可以找到其同方向上模为1的向量,只要让两个分量分别除以模就好了,例如上面的基就可以变为:
。
现在我们想获得(3,2)在新基上的坐标,即在两个方向上的投影矢量值,那么根据内积的几何意义,我们只要分别计算(3,2)和两个基的内积,不难得到新的坐标为
。
下图给出了新的基以及(3,2)在新基上坐标值的示意图:
另外这里要注意的是,我们列举的例子中基是正交的(即内积为0,或者说相互垂直),但是可以成为一组基的唯一要求就是线性无关,非正交的基也是可以的,不过因为正交基有较好的性质,所以一般使用的基都是正交的。
3.3 基变换的矩阵表示
下面我们找一种简单的方式来表示基变换,还是拿上面的例子,想一下,将(3,2)变换为新基上的坐标,就是用(3,2)与第一个基做内积运算,作为第一个新的坐标分量,然后用(3,2)与第二个基做内积运算,作为第二个新坐标的分量。实际上,我们可以用矩阵想成的形式简洁的表示这个变换:
那么其中矩阵的两行分别为两个基,乘以原向量,其结果刚好为新基的坐标,可以稍微扩展一下,如果我们有m个二维向量,只要将二维向量按照列排成一个两行m列的矩阵,然后用“基矩阵”乘以这个矩阵,就得到了所有这些向量在新基下的值,例如(1,1),(2,2),(3,3)想变换到刚才那组基上,则可以变为这样:
于是一组向量的基变换被表示为矩阵的相乘。
一般地,如果我们有M个N维向量,想将其变换为由R个N维向量表示的新空间中,那么首先将R个基按照行组成矩阵A,,然后将向量按照列组成矩阵B,那么两个矩阵的乘积AB就是变换结果,其中AB的第m列为A中的第M列变换后的结果。
数学表示为:
其中Pi是一个行向量,表示第i个基,aj是一个列向量,表示第j个原始数据记录。
特别要注意的是,这里R可以小于N,而R决定了变换后数据的维数,也就是说,我们可以将一个N维数据变换到更低维度的空间中去,变换后的维度取决于基的数量,因此这种矩阵相乘的表示也可以表示为降维变换。
最后,上述分析同时给矩阵相乘找到了一种物理解释:两个矩阵相乘的意义是将右边矩阵中每一列列向量变换到左边矩阵中每一行行向量为基所表示的空间中去。更抽象的说:一个矩阵可以表示为一种线性变换。
3.4 协方差矩阵及优化目标
上面我们讨论了选择不同的基可以对同样一组数据给出不同的表示,而且如果基的数量少于向量的本身的维数,则可以达到降维的效果,但是我们还没有回答最关键的一个问题:如何选择基才是最优的,或者说,如果我们有一组N维向量,现在要将其降到K维(K小于N),那么我们应该如何选择K个基才能最大程度保留原有的信息?
要完全数学化这个问题非常繁杂,这里我们用一个非形式化的直观方法来看这个问题。
为了避免过于抽象的讨论,我们仍然以一个具体的例子展开,假设我们的数据由五条记录组成,将它们表示为矩阵形式:
其中每一列为一条数据记录,而一行为一个字段,为了后续处理方便,我们首先将每个字段内所有值都减去字段均值,其结果是将每个字段都变为均值为0(这样做的好处后面可以看到)。
我们看上面的数据,第一个字段的均值为2,第二个字段的均值为3,所以变换后:
我们可以看到五条数据在平面直角坐标系内的样子:
现在问题来了:如果我们必须使用一维来表示这些数据,又希望尽量保留原始的信息,你要如何选择?
通过上一节对及变换的讨论我们知道,这个问题实际上是要在二维平面中选择一个方向,将所有数据都投影到这个方向所在的直线上,用投影值表示原始记录,这是一个实际的二维降到一维的问题。
那么如何选择这个方向(或者说是基)才能尽量保留最多的原始信息呢?一种直观的看法是:希望投影后的投影值尽可能分散。
以上图为例,可以看出如果向x轴投影,那么最左边的两个点会重叠在一起,中间的两个点也会重叠在一起,于是本身四个各不相同的二维点投影后只剩下两个不同的值了,这是一种严重的信息丢失,同理,如果向y轴投影最上面的两个点和分布在x轴上的两个点也会重叠,所以看来x和y轴都不是最好的投影选择。我们直观目测,如果向通过第一象限和第三象限的斜线投影,则五个点在投影后还是可以区分的。
下面我们用数学方法表述这个问题。
3.5 方差
上文说道,我们希望投影后投影值尽可能分散,而这种分散程度,可以用数学上的方差来表述,此处,一个字段的方差可以看做事每个元素与字段均值的差的平方和的均值,即:
由于上面我们已经将每个字段的均值都化0 了,因此方差可以直接用每个元素的平方和除以元素个数表示:
于是上面的问题被形式化表示为:寻找一个一维基,使得所有数据变换为这个基上的坐标表示后,方差值最大。
3.6 协方差
对于上面二维降成一维的问题来说,找到那个使得方差最大的方向就可以了,不过对于更高维,还有一个问题需要解决,考虑三维降到二维问题,与之前相同,首先我们希望找到一个方向使得投影后方差最大,这样就完成了第一个方向的选择,继而我们选择第二个投影方向。
如果我们还是单纯的只选择方差最大的方向,很显然,这个方向与第一个方向应该是“几乎重合在一起”,显然这样的维度是没有用的,因此应该有其他约束条件。从直观上讲,让两个字段尽可能表示更多的原始信息,我们是不希望他们之间存在线性相关性,因为相关性意味着两个字段不是完全独立,必然存在重复表示的信息。
数字上可以用两个字段的协方差表示其相关性,由于已经让每个字段均值为0,则:
可以看出,在字段均值为0的情况下,两个字段的协方差简洁的表示为其内积除以元素数m。
当协方差为0时,表示两个字段完全独立,为了让协方差为0,我们选择第二个即时只能在与第一个基正交的方向上选择。因此最终选择的两个方向一定是正交的。
至此,我们得到了降维问题的优化目标:将一组N维向量降维k维(K大于0,小于N),其目标是选择K个单位(模为1)正交基,使得原始数据变换到这组基上后,各字段两两间协方差为0,而字段的方差则尽可能大(在正交的约束下,取最大的k个方差)。
然后我们用X乘以X的转置,并乘上系数1/m:
这时候我们会发现,这个矩阵对角线上的两个元素分别是两个字段的方差,而其他元素是a和b的协方差,两者被统一到了一个矩阵的。
根据矩阵相乘的运算法则,这个结论很容易被推广到一般情况:
设我们有m个n维数据记录,将其按列排成n乘m的矩阵X,设
,则C是一个对称矩阵,其对角线分别是各个字段的方差,而第l行j列和j行i列元素相同,表示i和j两个字段的协方差。
3.7 协方差矩阵
上面我们导出了优化目标,但是这个目标似乎不能直接作为操作指南(或者说算法),因为它只说要什么,但是根本没有说怎么做,所以我们要在数学上继续研究计算方案。
我们看到,最终要达到的目标与字段内方差及字段间协方差有密切关系。因此我们希望能将两者统一表示,仔细观察发现,两者均可以表示为内积的形式,而内积又与矩阵相乘密切相关。于是,我们来了灵感:
假设我们只有a和b 两个字段,那么我们将他们按行组成矩阵X:
3.8 协方差矩阵对角化
根据上述推导,我们发现要达到优化目前等价于将协方差矩阵对角化:即除对角线外的其他元素化为0,并且在对角线上将元素按照大小从上到下排列,这样我们就达到了优化目的,这样说可能还不清晰,我们进一步看下原矩阵与基变换后矩阵协方差矩阵的关系:
设原始数据矩阵X对于的协方差矩阵为C,而P是一组基按行组成的矩阵,设Y=PX,则Y为X对P做基变换后的数据,设Y的协方差矩阵为D,我们推导一下D与C的关系:
现在事情很明白,我们要找的P不是别的,而是能让原始协方差矩阵对角化的P,换句话说,优化目标变成了寻找一个矩阵P,满足PCPT是一个对角矩阵,并且对角元素按照从大到小依次排列,那么P的前K行就是要寻找的基,用P的前K行就是要寻找的基,用P的前K行组成的矩阵乘以X就使得X从N维降到了K维并满足上述优化条件。
至此,我们离“发明”PCA还有一步之遥!
现在所有的焦点都聚集在了协方差矩阵对角化问题上,有时,我们真应该感谢数学家的先行,因为矩阵对角化在线性代数领域已经属于被玩烂的东西,所以这在数学上根本不是问题。
由上文知道,协方差矩阵C是一个对称矩阵,在线性代数上,实对称矩阵有一系列非常好的性质:
1)实对称矩阵不同特征值对应的特征向量必然正交。
2)设特征向量
重数为r,则必然存在r个线性无关的特征向量对应于
,因此可以将这r个特征向量单位正交化。
有上面两条可知,一个n行n列的实对称矩阵一定可以找到n个单位正交特征向量,设这n个特征向量为
,我们将其按照列组成矩阵:
则对协方差矩阵C有如下结论:
其中
为对称矩阵,其对角元素为各特征向量对应的特征值(可能有重复)。
到这里,我们发现我们已经找到了需要的矩阵P:
P是协方差矩阵的特征向量单位化后按照行排列出的矩阵,其中每一行都是C的一个特征向量,如果设P按照
中特征值从大到小,将特征向量从上到下排列,则用P的前K行组成的矩阵乘以原始数据矩阵X,就可以得到我们需要的降维后的数据矩阵Y。
至此,我们完成了整个PCA的数学原理讨论。
3.9 对上面例子整合
1,原始数据集矩阵X:
2,求均值后:
3,再求协方差矩阵:
4,特征值:
5,对应的特征向量:
6,标准化:
7,选择较大特征值对应的特征向量:
8,执行PCA变换:Y=PX 得到的Y就是PCA降维后的值 数据集矩阵:
四,主成分分析(PCA)算法步骤
PCA(Principal Components Analysis)即主成分分析,是一种常用的数据分析手段,是图像处理中经常用到的降维方法。对于一组不同维度之间可能存在线性相关关系的数据,PCA能够把这组数据通过正交变换变成各个维度之间线性无关的数据,经过PCA处理的数据中的各个样本之间的关系往往更直观,所以它是一种非常常用的数据分析和预处理工具。PCA处理之后的数据各个维度之间是线性无关的,通过剔除方差较小的那些维度上的数据,我们可以达到数据降维的目的。
PCA从原始变量出发,通过旋转变化(即原始变量的线性组合)构建出一组新的,互不相关的新变量,这些变量尽可能多的解释原始数据之间的差异性(即数据内在的结构),他们就成为原始数据的主成分。由于这些变量不相关,因此他们无重叠的各自解释一部分差异性。依照每个变量解释时差异性大小排序,他们成为第一主成分,第二主成分,以此类推。
主成分分析(PCA)是一种基于变量协方差矩阵对数据进行压缩降维,去噪的有效方法,PCA的思想是将n维特征映射到k维上(k
说了这么多,下面说一下PCA降维的算法步骤。
设有m条n维数据:
1) 将原始数据按列组成n行m列矩阵X
2)将X的每一行(代表一个属性字段)进行零均值化(去平均值),即减去这一行的均值
3)求出协方差矩阵
4)求出协方差矩阵的特征值及对应的特征向量
5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P(保留最大的k各特征向量)
6)Y=PX 即为降维到K维后的数据
五,实例PCA计算过程
现在假设有一组数据如下:
行代表了样例,列代表了特征,这里有10个样例,每个样例两个特征,可以这样认为,有10篇文档,x是10篇文档中“learn”出现的TF-IDF,y是10篇文档中“study”出现的IF_IDF。
第一步,分别求x和y的平均值,然后对所有的样例,都减去对应的均值。这里x的均值为1.81,y的均值为1.91,那么第一个一个样例减去均值后为(0.69,0.49),以此类推得到:
代码:x = [2.5,0.5,2.2,1.9,3.1,2.3,2,1,1.5,1.1]y = [2.4,0.7,2.9,2.2,3.0,2.7,1.6,1.1,1.6,0.9]import numpyas np mean_x = np.mean(x)mean_y = np.mean(y) result_x = [round(x[i]-mean_x ,2)for iin range(len(x))]result_y = [round(y[i]-mean_y ,2)for iin range(len(y))]print(result_x)print(result_y)
第二步,计算特征协方差矩阵,如果数据是三维的,那么协方差矩阵为:
这里是2维的,只有x和y,求解得:
对角线上分别是x和y的方差,非对角线上是协方差。协方差是衡量两个变量同时变化的变化程度。协方差大于0表示x和y若一个增加,另一个也增加;协方差小于0宝石一个增加,则另一个减少。如果x和y是统计独立的,那么二者之间的协方差就是0;但是协方差是0 ,并不能说明x和y是独立的。协方差绝对值越大,两者对彼此的影响越大,反之越小。协方差是没有单位的量,因此,如果同样的两个变量所采用的量纲发生变化,他们的协方差也会产生数值上的变化。
代码:x = [2.5,0.5,2.2,1.9,3.1,2.3,2,1,1.5,1.1]y = [2.4,0.7,2.9,2.2,3.0,2.7,1.6,1.1,1.6,0.9]import numpyas np mean_x = np.mean(x)mean_y = np.mean(y) result_x = [round(x[i]-mean_x ,2)for iin range(len(x))]result_y = [round(y[i]-mean_y ,2)for iin range(len(y))]print(result_x)print(result_y)z = np.vstack((result_x,result_y))cov = np.cov(z)print(cov)
第三步,计算协方差矩阵的特征向量和特征值,选取特征向量
上面两个特征值,下面是对应的特征向量,特征值0.490833989对应的特征向量是(-0.735178656, 0.677873399),这里的特征向量是正交的、归一化的,即长度为1。x = [2.5,0.5,2.2,1.9,3.1,2.3,2,1,1.5,1.1]y = [2.4,0.7,2.9,2.2,3.0,2.7,1.6,1.1,1.6,0.9]import numpyas np mean_x = np.mean(x)mean_y = np.mean(y) result_x = [round(x[i]-mean_x ,2)for iin range(len(x))]result_y = [round(y[i]-mean_y ,2)for iin range(len(y))]print(result_x)print(result_y)z = np.vstack((result_x,result_y))cov = np.cov(z)print(cov) # 特征值 特征向量feature_result,feature_vector = np.linalg.eig(cov)print(feature_result)print(feature_vector)
第四步,将特征值按照从大到小的顺序排序,选择其中最大的k个,然后将其对应的k各特征向量分别作为列向量组成特征向量矩阵。
如果数据中有n维,计算出n个特征向量和特征值,选择前k个特征向量,然后最终的数据集合只有k维,取的特征向量命名为FeatureVector。
这里的特征值只有两个,我们选择其中最大的那个,这里是1.28402771,对应的特征向量是(-0.677873399, -0.735178656)T。
第五步,将样本点投影到选取的特征向量上,得到新的数据集
假设样例数为m,特征数为n,减去均值后的样本矩阵为DataAdjust(m*n),协方差矩阵是n*n,选取的k个特征向量组成的矩阵为EigenVectors(n*k)。那么投影后的数据FinalData为
这里是FinalData(10*1) = DataAdjust(10*2矩阵)×特征向量
得到结果为
这样,就将原始样例的n维特征变成了k维,这k维就是原始特征在k维上的投影。
上面的数据可以认为是learn和study特征融合为一个新的特征叫LS特征,该特征基本上代表了这两个特征,该过程如下图所示:
正号表示预处理后的样本点,斜着的两条线就分别是正交的特征向量(由于协方差矩阵是对称的,因此其特征向量正交),最后一句矩阵乘法就是将原始样本点分别往特征向量对应的轴上做投影,下图是FinalData根据最大特征值对应的特征向量转化回去后的数据集形式,可看出是将DataAdjust样本点分别往特征向量对应的轴上做投影:
如果取的k=2,那么结果是
可见,若使用了所有特征向量得到的新的数据集,转化回去之后,与原来的数据集完全一样(只是坐标轴旋转)。
六,python实现主成分(PCA)降维from numpyimport * def loadDataSet(fileName, delim='\t'):fr= open(fileName)stringArr= [line.strip().split(delim)for linein fr.readlines()]datArr= [map(float,line)for linein stringArr]return mat(datArr) def pca(dataMat, topNfeat=999999):meanVals= mean(dataMat, axis=0)DataAdjust= dataMat- meanVals#减去平均值covMat= cov(DataAdjust, rowvar=0)eigVals,eigVects= linalg.eig(mat(covMat))#计算特征值和特征向量#print eigValseigValInd= argsort(eigVals)eigValInd= eigValInd[:-(topNfeat+1):-1]#保留最大的前K个特征值redEigVects= eigVects[:,eigValInd]#对应的特征向量lowDDataMat= DataAdjust* redEigVects#将数据转换到低维新空间reconMat= (lowDDataMat* redEigVects.T)+ meanVals#重构数据,用于调试return lowDDataMat, reconMat
测试数据testSet.txt由1000个数据点组成。下面对数据进行降维,并用matplotlib模块将降维后的数据和原始数据一起绘制出来。
数据:(此数据直接复制可能无法使用,会报错, could not convert string to float,建议最好下载)10.235186 11.32199710.122339 11.8109939.190236 8.9049439.306371 9.8473948.330131 8.34035210.152785 10.12353210.408540 10.8219869.003615 10.0392069.534872 10.0969919.498181 10.8254469.875271 9.23342610.362276 9.37689210.191204 11.2508517.720499 6.4763009.334379 8.4712687.963186 6.7313338.244973 9.0137859.569196 10.5689498.854793 9.0765369.382171 7.2408628.179055 8.9445028.267896 8.7970179.047165 8.7250688.741043 7.9013857.190216 7.8045878.081227 9.3144318.047460 5.7207807.917584 7.5432548.676942 10.1022209.210251 9.4247177.732998 9.8402027.681754 8.6098977.925863 10.0791598.261509 8.2420808.514872 7.52756110.324450 10.8044817.856710 7.9315437.858608 7.9953409.196808 6.5775989.644415 10.9350819.579833 9.0850217.888484 5.9764289.072624 9.7033448.914184 9.2985157.822869 7.08666310.538554 11.0614648.280187 8.7090128.884223 8.6701059.359927 10.5750559.078611 9.7108337.935134 8.5861738.805945 10.5751459.584316 9.61407611.269714 11.7172549.120444 9.0197747.977520 8.3139238.104648 9.4561288.617126 7.3317239.033811 9.4697068.327680 5.1220928.532272 10.1009099.295434 8.9338249.905202 9.02755910.585764 10.91273310.427584 11.5325789.072767 9.9601449.164275 8.6451219.746058 10.7170809.286072 9.3400248.188233 7.4324157.948598 8.4454197.563350 5.6561788.972405 8.8018699.980868 8.7889967.753490 7.7142487.431143 9.0328198.943403 8.35935410.481890 9.9889699.150454 10.2787608.123894 9.0603518.626164 8.4693427.354185 7.63125211.323046 11.0150328.190008 6.8607928.412598 7.6613589.258404 8.58038211.007915 11.4438818.279403 8.3470038.931149 10.10522110.239245 10.0774738.129346 7.0968778.485823 9.37356110.703640 11.6516189.500728 8.1502289.712414 9.9104459.333374 9.4075578.787865 10.1680219.238180 10.2534789.577388 8.89515010.447753 10.3182279.303944 9.2231369.883268 11.6629459.471921 10.44379210.007753 9.5799128.110298 7.1062636.964069 6.58504010.413499 9.6493098.032629 7.0532548.015549 9.16675310.462924 8.6566129.530788 10.1341309.202658 9.31422210.103241 10.2351597.849264 6.6248569.059071 7.99255510.172889 10.7247899.528439 6.4209907.190422 6.7897929.085716 9.8463289.452887 8.7353867.417322 7.3485948.468639 8.7150868.303642 9.4632319.939052 10.0267718.701989 7.5169789.737541 10.5872818.280233 7.85244410.648386 10.2592039.173893 10.5203729.135397 10.7514067.594580 8.4888338.587520 8.4634068.581887 7.8886449.448768 8.7074227.882664 7.77203010.050635 9.8597209.012078 9.5338998.770020 8.8829969.428804 9.4463068.504209 8.3196939.800003 10.9646678.069660 7.68309910.012217 10.3206448.704677 8.9181468.198722 7.2977869.868322 9.9016579.426997 11.4803539.228767 9.2629768.952359 9.5284718.186847 8.6005879.026371 8.7051439.483364 9.8070797.826587 7.97540111.197846 10.9592987.632421 8.7697458.761605 8.3093659.353670 8.7287586.466637 6.0389968.370634 9.17883010.337451 11.0756008.917679 8.2883679.076621 8.4876267.278948 4.63409710.153017 11.2191837.132603 5.8531189.338644 9.8059409.878602 9.18700010.009505 10.9245059.384438 10.6918607.535322 8.1604816.808732 8.2684698.302965 8.0750098.345379 8.3053569.517530 8.2498399.267825 9.99910910.291511 11.0326648.605909 8.7052078.331145 7.8122958.632412 10.5742878.766397 8.7121079.407070 9.7327569.709495 9.72956910.422201 11.0703606.831495 6.4667638.187122 8.4059298.523093 9.0418447.952394 6.80122010.490780 10.00146810.813791 9.8024947.861113 7.5414758.800399 8.7389747.542152 6.6128389.446981 9.3786598.281684 7.3585728.473801 8.20834311.736767 11.0220298.379578 8.7143488.313718 8.8323819.342589 10.4166597.560710 6.8896489.295344 9.7390409.176612 9.7187818.614385 10.1505219.079373 8.83979410.333289 10.9212559.453502 7.33513410.174590 10.2925009.693713 9.7936367.474925 7.75139110.107905 10.1569979.257241 7.85426610.209794 11.4101577.248050 6.43367610.150091 9.28859710.077713 10.3215008.191122 8.9315198.791469 10.2872169.229434 9.0951938.682571 8.5460057.524099 7.7097518.442410 8.3260379.364851 9.0959899.061222 7.5578997.989999 8.5553638.801275 8.86873210.351932 9.49779610.230710 10.4961519.783163 9.89140810.651481 9.4316178.387393 6.4005079.003921 7.0500038.483723 8.3148869.020501 7.5457719.329105 11.0956619.583687 9.2719298.908705 8.4075298.835406 8.0835179.736362 8.29673510.030302 9.7371788.287142 6.9934609.173211 9.3063359.026355 9.6965319.128391 9.92124711.486346 12.91077711.519458 11.4721119.027707 10.2639749.351935 8.5422009.421701 11.4032019.005687 8.1009697.015279 6.6142788.213607 8.3409488.226646 8.7189978.144753 8.36687710.133642 12.79016910.763481 10.84701610.003622 10.3377169.007955 9.7924828.670506 10.78293110.386414 9.95616210.104761 10.1230448.079502 8.3040759.945424 11.8554098.642497 9.9980669.349722 8.6903289.034991 8.8264908.738746 7.5184648.919532 9.7403129.464136 10.44458810.710057 12.66685710.042007 10.5320918.447996 7.4263639.509351 9.03051611.946359 10.5530759.981617 9.9126519.853876 9.63296710.560648 11.8817148.370952 9.9894918.323209 10.1025299.828359 11.7024628.515623 8.4267549.004363 9.62803610.529847 10.45803110.028765 10.6248809.448114 9.3132278.332617 7.3822958.323006 8.2766087.740771 8.7997508.379615 8.1461928.340764 9.1844589.863614 8.2546949.969563 9.4051349.164394 9.18212710.622098 9.7225929.592072 10.0294468.212027 7.4773669.080225 8.2444488.555774 7.8423259.958046 9.6962218.972573 9.7971289.213223 7.1284378.737239 9.38513810.333907 10.9948568.797511 8.64307511.044848 9.6231608.539260 9.09711311.582163 11.8843337.863848 7.1761996.218103 5.2835629.120602 7.2501909.001166 9.6352038.081476 8.8442249.369802 8.2309118.768925 8.6669879.841098 8.54389610.451522 9.5495119.755402 9.1175227.988961 6.8698548.872507 9.78711810.363980 10.7166086.315671 5.7659539.638879 9.2023558.588126 8.0379668.947408 9.1443869.051130 7.1951329.321709 8.38066810.146531 9.7547459.843373 8.8914379.213148 11.7006327.630078 7.2947538.093088 7.9675907.488915 6.0906528.126036 8.5864728.760350 7.26898710.201347 9.1410137.838208 7.3077006.155653 5.5639977.767841 6.2545288.425656 8.61583210.362168 10.88681510.180024 10.3789349.794665 10.0478129.970394 9.6682797.030217 7.0604719.275414 9.09573810.314911 10.4565399.259774 8.20485110.023919 9.5583078.887540 9.8667049.851608 9.4109898.710882 7.2680129.017007 10.2176737.976369 9.0009798.738332 8.6647348.344510 8.9776008.959613 12.3242409.169982 8.6246357.487451 8.1548598.706316 7.7194559.564832 8.9404038.327775 9.0445099.734032 10.1952558.021343 6.4450929.081048 11.0243977.626651 6.54926310.725858 8.5753748.731381 8.30778810.394237 10.5968747.029311 7.6588329.517907 7.50990410.394064 10.06089810.752500 9.4316019.692431 10.3321309.651897 7.8768628.592329 10.09683710.212801 10.8274969.045043 9.2655248.901643 8.03611510.794525 9.31883011.040915 12.0217468.390836 9.6724699.840166 11.22656810.806810 12.2056338.924285 10.9340568.411251 8.2896727.808891 9.6632909.733437 8.4869588.300026 7.4773748.221756 10.2783089.096867 9.6196779.410116 9.28918810.097176 9.7684709.387954 8.8448559.376134 7.7046308.231599 9.1012039.910738 10.6948558.645689 7.7645898.090245 7.1095969.253483 9.8136729.331546 8.0393869.843256 10.2087929.713131 9.2476659.259369 10.70462210.243948 9.6958836.396262 6.4563908.936289 8.7038718.750846 9.3472736.497155 4.1302519.516552 10.1648489.125766 8.8587758.374387 7.3001148.132816 7.62110710.099505 9.1591349.356477 6.8699998.112934 7.5875477.265396 6.98703111.950505 13.71510910.745959 10.8221718.893270 7.8873326.003473 4.9602197.498851 6.45133410.162072 9.9359548.732617 9.1776799.300827 9.95236011.908436 12.2568019.371215 9.1886459.943640 9.2450377.386450 7.0468198.410374 8.2932187.830419 6.4402538.263140 8.27944611.448164 12.1923638.216533 9.1866289.316128 10.0466978.156927 6.8347929.951421 11.2405989.059607 8.45844610.476339 10.5604617.548200 7.2271279.432204 7.2367059.402750 9.12641311.188095 13.8534269.520201 11.0281318.884154 9.7640718.961105 8.8331178.549663 8.86576510.111708 10.5154629.024761 9.1693687.904149 8.0487569.240995 7.7961428.126538 6.1161257.442148 7.9313359.486821 10.0913599.834289 11.6947209.009714 11.5991709.761314 11.3440836.993941 6.5629888.659524 8.4101077.685363 8.0972977.793217 6.5191098.883454 9.2573478.781821 9.2319807.946281 7.6589788.523959 10.6464809.031525 8.6496488.317140 7.7589789.192417 11.1512188.408486 8.28218210.327702 11.4590488.389687 8.5487278.642250 7.0568708.833447 9.2676388.805261 8.3202819.726211 9.0959978.477631 9.5075309.738838 9.6521108.272108 7.5826969.258089 8.4959318.334144 8.8107668.150904 6.4860327.259669 7.27015611.034180 11.51995410.705432 10.6425278.388814 7.1591378.559369 7.8462847.187988 6.5193138.811453 7.7659008.492762 7.9929418.739752 8.50290910.150752 10.4202957.062378 5.3652898.448195 7.48000010.224333 11.5927509.533795 9.2128459.519492 7.6905019.661847 10.3761897.963877 8.59719310.184486 9.1367098.505234 9.1592108.187646 8.5186909.167590 9.4059178.612162 8.51875510.970868 10.3922299.603649 9.1410959.704263 8.8301789.657506 8.1324499.337882 11.0453069.521722 9.5377648.954197 8.7281798.635658 10.3526628.910816 9.0203179.900933 9.39200210.247105 8.2896499.571690 8.1712377.388627 7.6680718.354008 10.0745909.775598 8.8356968.768913 7.9836048.330199 8.4740988.169356 9.36117210.346522 10.0864347.976144 9.2667028.429648 7.86582411.261674 11.78858710.051066 10.1124258.954626 9.7893438.382220 8.1210129.820642 9.4264418.125950 9.6950878.646465 7.2918088.190202 8.0037378.773887 7.3061758.731000 10.3004369.163098 7.8167699.456346 9.2239229.645180 9.3240538.835060 8.9669159.325950 10.9432489.941912 9.5485359.282799 10.1194889.567591 9.4621648.529019 9.7680019.314824 10.1537278.264439 8.2738608.307262 8.2140369.122041 8.6578618.404258 8.3893657.828355 8.4194339.803180 10.1082868.662439 8.5819538.883265 8.9783778.012330 8.2624519.420258 8.9748787.015415 6.3659409.888832 11.1630369.677549 10.3464318.410158 7.9128999.464147 10.7629007.067227 7.0357179.320923 10.5830899.056917 8.7712418.110004 8.38778910.310021 10.9700148.211185 8.8096278.942883 8.8407469.479958 8.3287008.973982 8.7022918.519257 8.7648559.424556 8.9569117.222919 8.1777878.257007 9.7006199.778795 9.2961348.028806 8.5759749.886464 9.9650769.090552 6.9789309.605548 10.2567519.959004 9.6102298.308701 9.5091247.748293 9.6859338.311108 9.4281149.697068 10.2179569.582991 9.4787739.167265 10.19841210.329753 10.4066028.908819 7.42878910.072908 10.3932947.992905 9.2266298.907696 7.2693668.421948 9.3429687.481399 7.22503310.358408 10.1661308.786556 10.2799439.658701 11.37936710.167807 9.4175528.653449 8.6566818.020304 8.6712708.364348 10.0040689.119183 9.7881998.405504 9.74058011.020930 11.9043509.755232 9.51571310.059542 9.5897488.727131 9.7779987.666182 6.0286428.870733 8.3675019.340446 7.7072699.919283 10.7968137.905837 8.32603410.181187 10.0898658.797328 8.9819888.466272 7.76503210.335914 12.6205399.365003 8.6091158.011017 7.24948910.923993 13.9015137.074631 7.5587209.824598 8.8512978.861026 8.37085710.127296 10.86153510.548377 10.8556958.880470 7.9487618.901619 9.6747057.813710 9.24691210.128808 10.56066811.096699 10.9116448.551471 6.8715148.907241 8.67781510.571647 10.2948388.815314 8.8107258.453396 8.3392969.594819 11.48758010.714211 9.6289087.428788 7.71286910.892119 12.7477529.024071 11.1126927.803375 7.8470388.521558 8.8818489.742818 11.5202039.832836 9.1803968.703132 10.0284989.905029 11.34760610.037536 8.8826888.629995 8.3928639.583497 9.2196638.781687 9.6505989.344119 9.53702410.407510 9.2239297.244488 6.55902110.643616 10.2883838.757557 6.94790110.784590 11.23335010.028427 11.3300337.968361 6.8303088.925954 8.5391137.738692 7.1149878.192398 8.35201610.412017 12.4311228.208801 5.7776787.820077 7.7907209.542754 11.5425416.817938 7.4292297.365218 7.9567979.274391 7.9327009.546475 8.8034127.471734 6.7978708.016969 7.8480708.852701 8.4581148.215012 8.4683306.975507 6.8469809.435134 10.6097009.228075 9.3426228.388410 7.6378567.111456 9.2891639.403508 8.4826549.133894 8.34357510.670801 9.7508219.983542 10.07453710.012865 8.5370178.929895 8.9519097.666951 7.4736159.493839 7.8217838.894081 7.0594139.593382 9.8597329.126847 8.3957009.532945 9.8506969.459384 9.3842138.982743 8.21706210.107798 8.79077210.563574 9.0448908.278963 9.5187908.734960 10.4941299.597940 9.53089510.025478 9.50827010.335922 10.9740638.404390 8.1467487.108699 6.0384698.873951 7.4742278.731459 8.1544558.795146 7.5346876.407165 6.8103529.979312 10.2874308.786715 8.39673610.753339 10.36056710.508031 10.32197610.636925 10.19379710.614322 11.2154208.916411 8.9652868.112756 8.30476910.833109 10.4975428.319758 9.7276919.945336 11.82009710.150461 9.91471510.185024 10.3887229.793569 9.07995510.590128 11.8115968.505584 6.88428210.461428 10.7454398.755781 9.4184277.488249 7.17207210.238905 10.4286599.887827 10.4278218.529971 8.8382178.375208 10.2428378.901724 8.3983048.607694 9.1731988.691369 9.9642619.584578 9.64154610.265792 11.4050787.592968 6.6833558.692791 9.3890317.589852 6.00579310.550386 11.7365848.578351 7.2270557.526931 6.8751348.577081 9.8771159.272136 11.05092810.300809 10.6530598.642013 9.0066819.720491 10.2652029.029005 9.6469288.736201 7.9756038.672886 9.0707598.370633 8.4121709.483776 9.1833416.790842 7.5949929.842146 10.1568109.563336 7.9625328.724669 9.8707329.012145 9.1713269.116948 9.7911676.219094 7.9884209.468422 8.3599758.825231 8.4752089.572224 9.6964289.609128 8.4881759.428590 10.4689988.293266 8.6177019.423584 10.3556889.240796 9.51722810.915423 13.02625210.854684 11.1308669.226816 9.3917969.580264 10.3592357.289907 6.8982089.338857 10.3740259.523176 11.33219010.162233 10.3573968.873930 9.2073988.607259 7.7948048.852325 8.2157978.077272 6.5010428.169273 8.2696136.806421 7.5444238.793151 9.69154911.640981 11.3657029.544082 11.5765459.009266 9.6055969.726552 9.4267199.495888 10.6266248.683982 9.3378648.322105 8.6310998.887895 8.6449318.662659 11.3730259.263321 7.5360167.802624 7.1716258.773183 8.5615658.730443 10.1975968.942915 7.7583838.057618 8.7749968.112081 8.20234910.378884 12.1037559.248876 8.6372499.739599 9.7085768.126345 8.2784878.894788 7.9661179.683165 9.01922110.886957 12.0538439.668852 10.9021327.486692 6.4711388.794850 9.1736098.835915 8.2967279.443984 11.3753448.696621 6.4345809.645560 9.2337229.623857 7.91559010.840632 12.6202687.298135 7.3561419.639644 8.9023899.849802 7.68262410.609964 10.2596159.768229 11.3828117.646351 7.57184910.230300 9.4708598.224402 8.4968666.879671 8.3936487.976247 8.6672219.183268 8.69455011.471853 12.78628010.428349 10.6157268.090828 5.9025049.738627 8.4857928.139709 8.3963339.508055 8.9905298.857260 8.4977328.902558 7.0144339.660607 11.0408338.772221 10.51215011.020038 9.3541347.918527 7.7420627.630835 7.75626011.043272 11.0416139.299376 8.6741579.795087 8.4318379.415683 8.3121017.942037 6.9429139.724790 11.76649610.222032 11.5508768.894163 8.3060208.394309 8.0704209.012776 6.8805489.661093 10.1389219.896472 9.7623729.135628 8.7599288.762656 10.3060288.602473 8.86195610.085297 10.46477410.644983 10.9457679.034571 8.3916688.602920 8.5019448.224766 7.4027588.755050 9.4310859.669937 8.64104910.693530 10.2871249.462806 7.6111539.287707 10.08236310.941260 10.7837289.263080 7.91332810.167111 10.2253388.783830 9.4653458.958624 8.6621369.841649 9.9267817.205691 6.7906388.629089 9.1354617.469440 8.4504428.179133 7.7904348.083984 7.8755209.271300 8.1353598.652349 8.2543977.983920 6.6096847.836860 9.7852387.418535 7.0112568.458288 10.0953649.387605 9.7269118.663951 8.20670510.146507 11.6985778.937103 10.99092411.218687 11.1419458.363142 9.1069367.877643 7.1229229.620978 9.9056899.509649 10.7732096.748743 6.7053859.300919 8.0850299.332257 9.8187917.898610 8.3666439.841914 9.4806756.920484 8.9595018.544713 9.5631368.162266 6.7152778.659552 9.28200810.673398 13.1748249.024000 10.3792388.183292 6.64757210.544919 10.6496027.201266 6.5296059.557407 11.0968218.304605 6.9409299.742855 9.92089710.024587 9.64522210.002296 9.9989408.965876 8.6654197.823136 6.9495728.125088 7.6540656.569589 6.04686310.195497 8.68912911.730011 10.3742218.739105 7.4575719.820059 10.2785269.547456 10.3981988.375072 8.4163028.889533 8.3089298.861201 9.29040812.677687 12.7884639.100735 8.6205377.728350 6.3282197.955373 8.3550288.733352 8.64541410.257527 11.1918139.246413 9.4970149.745302 9.6420357.785652 8.1476217.431673 8.5663998.654384 8.4667018.475392 6.7446779.968440 10.76519210.163616 10.80696310.238135 10.0366369.902889 10.7467309.523850 8.7497089.214363 9.1491789.266040 10.8415028.494292 7.77094210.821158 10.4101928.645888 7.9703089.885204 10.0980809.084990 10.8863499.277874 8.8714498.135131 7.1370647.917379 9.0805229.685586 8.8228508.558141 7.8481129.502917 10.0612556.409004 5.16477410.149235 10.5799517.847304 8.4113518.846930 6.8199398.675153 9.4111479.476276 9.06150811.099184 10.6442638.792411 10.3794058.400418 7.0727068.555713 7.9238058.024763 8.4269938.642696 10.4534127.906117 7.9204088.793393 9.7228788.280364 7.6698549.387766 9.7062459.626853 10.76249910.163631 10.9190079.375543 11.5135249.309440 8.57569910.055329 10.2972558.706241 9.09717210.032934 11.95189710.812974 11.31143510.352603 10.8198658.276870 9.0554038.397389 7.9444349.371741 10.39579010.825710 10.1440999.158483 11.38538210.658639 11.3898568.091762 6.63103910.734892 10.05459811.535880 11.6049129.799077 11.3716778.478725 9.0784559.399902 8.9477447.305377 8.1449737.613377 6.66879810.681308 10.8308459.973855 10.0041339.369918 7.8554338.838223 7.4290339.521831 10.6239309.724419 10.4474528.890224 9.2759239.932763 11.58995310.839337 9.0512508.497708 7.5217018.440236 8.7056709.063566 9.7557448.449647 8.9294858.554576 8.06323110.348606 10.5507185.985254 5.1868449.931937 10.1755829.854922 9.2013939.114580 9.13421510.334899 8.543604
import matplotlibimport matplotlib.pyplot as plt dataMat= loadDataSet('testSet.txt')lowDMat, reconMat= pca(dataMat,1)print "shape(lowDMat): ",shape(lowDMat) fig= plt.figure()ax= fig.add_subplot(111)ax.scatter(dataMat[:,0].flatten().A[0],dataMat[:,1].flatten().A[0],marker='^',s=90)ax.scatter(reconMat[:,0].flatten().A[0],reconMat[:,1].flatten().A[0],marker='o',s=50,c='red')plt.show()
结果如下图:
参考文献:
http://www.360doc.com/content/13/1124/02/9482_331688889.shtml
http://www.docin.com/p-160874280.html
https://www.zhihu.com/question/54100505/answer/432025686