码迷,mamicode.com
首页 > 编程语言 > 详细

深入学习主成分分析(PCA)算法原理及其Python实现

时间:2019-01-10 20:28:08      阅读:291      评论:0      收藏:0      [点我收藏+]

标签:set   而且   val   0.12   就是   如何   pre   重要   最优   

一:引入问题

  首先看一个表格,下表是某些学生的语文,数学,物理,化学成绩统计:

技术分享图片

  首先,假设这些科目成绩不相关,也就是说某一科目考多少分与其他科目没有关系,那么如何判断三个学生的优秀程度呢?首先我们一眼就能看出来,数学,物理,化学这三门课的成绩构成了这组数据的主成分(很显然,数学作为第一主成分,因为数据成绩拉的最开)。

  那么为什么我们能一眼看出来呢?

  当然是我们的坐标轴选对了!!

  下面,我们继续看一个表格,下标是一组学生的数学,物理,化学,语文,历史,英语成绩统计:

技术分享图片

  那么这个表我们能一眼看出来吗?

  数据太多了,以至于看起来有些凌乱,无法直接看出这组数据的主成分,因为在坐标系下这组数据分布的很散乱。究其原因,是因为无法拨开遮住肉眼的迷雾,如果把这些数据在相应的空间中表示出来,也许你就能换一个观察角度找出主成分,如下图所示:

技术分享图片

  简单的二维或者三维我们可以想象出来其分布状态,那么对于更高维的数据,能想象出来其分布吗?还有,就算能描述分布,如何精确地找到这些主成分的轴?如何衡量你提取的主成分到底占了整个数据的多少信息?所以,我们就要用到主成分分析的处理方法。

  为了说明什么是数据的主成分,我们首先得了解数据降维,数据降维时怎么回事?

二,数据降维

  假设三维空间中有一系列点,这些点分布在一个过原点的斜面上,如果你用自然坐标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的教程:A tutorial on Principal Components Analysis ——Lindsay I Smith

 

  PCA(Principal Components Analysis)即主成分分析,是一种常用的数据分析手段,是图像处理中经常用到的降维方法。对于一组不同维度之间可能存在线性相关关系的数据,PCA能够把这组数据通过正交变换变成各个维度之间线性无关的数据,经过PCA处理的数据中的各个样本之间的关系往往更直观,所以它是一种非常常用的数据分析和预处理工具。PCA处理之后的数据各个维度之间是线性无关的,通过剔除方差较小的那些维度上的数据,我们可以达到数据降维的目的。

  PCA从原始变量出发,通过旋转变化(即原始变量的线性组合)构建出一组新的,互不相关的新变量,这些变量尽可能多的解释原始数据之间的差异性(即数据内在的结构),他们就成为原始数据的主成分。由于这些变量不相关,因此他们无重叠的各自解释一部分差异性。依照每个变量解释时差异性大小排序,他们成为第一主成分,第二主成分,以此类推。

  主成分分析(PCA)是一种基于变量协方差矩阵对数据进行压缩降维,去噪的有效方法,PCA的思想是将n维特征映射到k维上(k<n),这k维特征称为主元(主成分),是旧特征的线性组合,这些线性组合最大化样本方差,尽量使用新的k个特征互不相关。这k维是全新的正交特征,是重新构造出来的k维特征,而不是简单地从n维特征中取出其余n-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 numpy as np

mean_x = np.mean(x)
mean_y = np.mean(y)

result_x = [round(x[i]-mean_x ,2) for i in range(len(x))]
result_y = [round(y[i]-mean_y ,2) for i in 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 numpy as np

mean_x = np.mean(x)
mean_y = np.mean(y)

result_x = [round(x[i]-mean_x ,2) for i in range(len(x))]
result_y = [round(y[i]-mean_y ,2) for i in 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 numpy as np

mean_x = np.mean(x)
mean_y = np.mean(y)

result_x = [round(x[i]-mean_x ,2) for i in range(len(x))]
result_y = [round(y[i]-mean_y ,2) for i in 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 numpy import *

def loadDataSet(fileName, delim=‘\t‘):
    fr = open(fileName)
    stringArr = [line.strip().split(delim) for line in fr.readlines()]
    datArr = [map(float,line) for line in 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 eigVals
    eigValInd = 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模块将降维后的数据和原始数据一起绘制出来。

(链接:https://pan.baidu.com/s/19k4ND3ISUjhfWZhj4Fhcbw 提取码:r3n7 )

数据:(此数据直接复制可能无法使用,会报错, could not convert string to float,建议最好下载)

10.235186	11.321997
10.122339	11.810993
9.190236	8.904943
9.306371	9.847394
8.330131	8.340352
10.152785	10.123532
10.408540	10.821986
9.003615	10.039206
9.534872	10.096991
9.498181	10.825446
9.875271	9.233426
10.362276	9.376892
10.191204	11.250851
7.720499	6.476300
9.334379	8.471268
7.963186	6.731333
8.244973	9.013785
9.569196	10.568949
8.854793	9.076536
9.382171	7.240862
8.179055	8.944502
8.267896	8.797017
9.047165	8.725068
8.741043	7.901385
7.190216	7.804587
8.081227	9.314431
8.047460	5.720780
7.917584	7.543254
8.676942	10.102220
9.210251	9.424717
7.732998	9.840202
7.681754	8.609897
7.925863	10.079159
8.261509	8.242080
8.514872	7.527561
10.324450	10.804481
7.856710	7.931543
7.858608	7.995340
9.196808	6.577598
9.644415	10.935081
9.579833	9.085021
7.888484	5.976428
9.072624	9.703344
8.914184	9.298515
7.822869	7.086663
10.538554	11.061464
8.280187	8.709012
8.884223	8.670105
9.359927	10.575055
9.078611	9.710833
7.935134	8.586173
8.805945	10.575145
9.584316	9.614076
11.269714	11.717254
9.120444	9.019774
7.977520	8.313923
8.104648	9.456128
8.617126	7.331723
9.033811	9.469706
8.327680	5.122092
8.532272	10.100909
9.295434	8.933824
9.905202	9.027559
10.585764	10.912733
10.427584	11.532578
9.072767	9.960144
9.164275	8.645121
9.746058	10.717080
9.286072	9.340024
8.188233	7.432415
7.948598	8.445419
7.563350	5.656178
8.972405	8.801869
9.980868	8.788996
7.753490	7.714248
7.431143	9.032819
8.943403	8.359354
10.481890	9.988969
9.150454	10.278760
8.123894	9.060351
8.626164	8.469342
7.354185	7.631252
11.323046	11.015032
8.190008	6.860792
8.412598	7.661358
9.258404	8.580382
11.007915	11.443881
8.279403	8.347003
8.931149	10.105221
10.239245	10.077473
8.129346	7.096877
8.485823	9.373561
10.703640	11.651618
9.500728	8.150228
9.712414	9.910445
9.333374	9.407557
8.787865	10.168021
9.238180	10.253478
9.577388	8.895150
10.447753	10.318227
9.303944	9.223136
9.883268	11.662945
9.471921	10.443792
10.007753	9.579912
8.110298	7.106263
6.964069	6.585040
10.413499	9.649309
8.032629	7.053254
8.015549	9.166753
10.462924	8.656612
9.530788	10.134130
9.202658	9.314222
10.103241	10.235159
7.849264	6.624856
9.059071	7.992555
10.172889	10.724789
9.528439	6.420990
7.190422	6.789792
9.085716	9.846328
9.452887	8.735386
7.417322	7.348594
8.468639	8.715086
8.303642	9.463231
9.939052	10.026771
8.701989	7.516978
9.737541	10.587281
8.280233	7.852444
10.648386	10.259203
9.173893	10.520372
9.135397	10.751406
7.594580	8.488833
8.587520	8.463406
8.581887	7.888644
9.448768	8.707422
7.882664	7.772030
10.050635	9.859720
9.012078	9.533899
8.770020	8.882996
9.428804	9.446306
8.504209	8.319693
9.800003	10.964667
8.069660	7.683099
10.012217	10.320644
8.704677	8.918146
8.198722	7.297786
9.868322	9.901657
9.426997	11.480353
9.228767	9.262976
8.952359	9.528471
8.186847	8.600587
9.026371	8.705143
9.483364	9.807079
7.826587	7.975401
11.197846	10.959298
7.632421	8.769745
8.761605	8.309365
9.353670	8.728758
6.466637	6.038996
8.370634	9.178830
10.337451	11.075600
8.917679	8.288367
9.076621	8.487626
7.278948	4.634097
10.153017	11.219183
7.132603	5.853118
9.338644	9.805940
9.878602	9.187000
10.009505	10.924505
9.384438	10.691860
7.535322	8.160481
6.808732	8.268469
8.302965	8.075009
8.345379	8.305356
9.517530	8.249839
9.267825	9.999109
10.291511	11.032664
8.605909	8.705207
8.331145	7.812295
8.632412	10.574287
8.766397	8.712107
9.407070	9.732756
9.709495	9.729569
10.422201	11.070360
6.831495	6.466763
8.187122	8.405929
8.523093	9.041844
7.952394	6.801220
10.490780	10.001468
10.813791	9.802494
7.861113	7.541475
8.800399	8.738974
7.542152	6.612838
9.446981	9.378659
8.281684	7.358572
8.473801	8.208343
11.736767	11.022029
8.379578	8.714348
8.313718	8.832381
9.342589	10.416659
7.560710	6.889648
9.295344	9.739040
9.176612	9.718781
8.614385	10.150521
9.079373	8.839794
10.333289	10.921255
9.453502	7.335134
10.174590	10.292500
9.693713	9.793636
7.474925	7.751391
10.107905	10.156997
9.257241	7.854266
10.209794	11.410157
7.248050	6.433676
10.150091	9.288597
10.077713	10.321500
8.191122	8.931519
8.791469	10.287216
9.229434	9.095193
8.682571	8.546005
7.524099	7.709751
8.442410	8.326037
9.364851	9.095989
9.061222	7.557899
7.989999	8.555363
8.801275	8.868732
10.351932	9.497796
10.230710	10.496151
9.783163	9.891408
10.651481	9.431617
8.387393	6.400507
9.003921	7.050003
8.483723	8.314886
9.020501	7.545771
9.329105	11.095661
9.583687	9.271929
8.908705	8.407529
8.835406	8.083517
9.736362	8.296735
10.030302	9.737178
8.287142	6.993460
9.173211	9.306335
9.026355	9.696531
9.128391	9.921247
11.486346	12.910777
11.519458	11.472111
9.027707	10.263974
9.351935	8.542200
9.421701	11.403201
9.005687	8.100969
7.015279	6.614278
8.213607	8.340948
8.226646	8.718997
8.144753	8.366877
10.133642	12.790169
10.763481	10.847016
10.003622	10.337716
9.007955	9.792482
8.670506	10.782931
10.386414	9.956162
10.104761	10.123044
8.079502	8.304075
9.945424	11.855409
8.642497	9.998066
9.349722	8.690328
9.034991	8.826490
8.738746	7.518464
8.919532	9.740312
9.464136	10.444588
10.710057	12.666857
10.042007	10.532091
8.447996	7.426363
9.509351	9.030516
11.946359	10.553075
9.981617	9.912651
9.853876	9.632967
10.560648	11.881714
8.370952	9.989491
8.323209	10.102529
9.828359	11.702462
8.515623	8.426754
9.004363	9.628036
10.529847	10.458031
10.028765	10.624880
9.448114	9.313227
8.332617	7.382295
8.323006	8.276608
7.740771	8.799750
8.379615	8.146192
8.340764	9.184458
9.863614	8.254694
9.969563	9.405134
9.164394	9.182127
10.622098	9.722592
9.592072	10.029446
8.212027	7.477366
9.080225	8.244448
8.555774	7.842325
9.958046	9.696221
8.972573	9.797128
9.213223	7.128437
8.737239	9.385138
10.333907	10.994856
8.797511	8.643075
11.044848	9.623160
8.539260	9.097113
11.582163	11.884333
7.863848	7.176199
6.218103	5.283562
9.120602	7.250190
9.001166	9.635203
8.081476	8.844224
9.369802	8.230911
8.768925	8.666987
9.841098	8.543896
10.451522	9.549511
9.755402	9.117522
7.988961	6.869854
8.872507	9.787118
10.363980	10.716608
6.315671	5.765953
9.638879	9.202355
8.588126	8.037966
8.947408	9.144386
9.051130	7.195132
9.321709	8.380668
10.146531	9.754745
9.843373	8.891437
9.213148	11.700632
7.630078	7.294753
8.093088	7.967590
7.488915	6.090652
8.126036	8.586472
8.760350	7.268987
10.201347	9.141013
7.838208	7.307700
6.155653	5.563997
7.767841	6.254528
8.425656	8.615832
10.362168	10.886815
10.180024	10.378934
9.794665	10.047812
9.970394	9.668279
7.030217	7.060471
9.275414	9.095738
10.314911	10.456539
9.259774	8.204851
10.023919	9.558307
8.887540	9.866704
9.851608	9.410989
8.710882	7.268012
9.017007	10.217673
7.976369	9.000979
8.738332	8.664734
8.344510	8.977600
8.959613	12.324240
9.169982	8.624635
7.487451	8.154859
8.706316	7.719455
9.564832	8.940403
8.327775	9.044509
9.734032	10.195255
8.021343	6.445092
9.081048	11.024397
7.626651	6.549263
10.725858	8.575374
8.731381	8.307788
10.394237	10.596874
7.029311	7.658832
9.517907	7.509904
10.394064	10.060898
10.752500	9.431601
9.692431	10.332130
9.651897	7.876862
8.592329	10.096837
10.212801	10.827496
9.045043	9.265524
8.901643	8.036115
10.794525	9.318830
11.040915	12.021746
8.390836	9.672469
9.840166	11.226568
10.806810	12.205633
8.924285	10.934056
8.411251	8.289672
7.808891	9.663290
9.733437	8.486958
8.300026	7.477374
8.221756	10.278308
9.096867	9.619677
9.410116	9.289188
10.097176	9.768470
9.387954	8.844855
9.376134	7.704630
8.231599	9.101203
9.910738	10.694855
8.645689	7.764589
8.090245	7.109596
9.253483	9.813672
9.331546	8.039386
9.843256	10.208792
9.713131	9.247665
9.259369	10.704622
10.243948	9.695883
6.396262	6.456390
8.936289	8.703871
8.750846	9.347273
6.497155	4.130251
9.516552	10.164848
9.125766	8.858775
8.374387	7.300114
8.132816	7.621107
10.099505	9.159134
9.356477	6.869999
8.112934	7.587547
7.265396	6.987031
11.950505	13.715109
10.745959	10.822171
8.893270	7.887332
6.003473	4.960219
7.498851	6.451334
10.162072	9.935954
8.732617	9.177679
9.300827	9.952360
11.908436	12.256801
9.371215	9.188645
9.943640	9.245037
7.386450	7.046819
8.410374	8.293218
7.830419	6.440253
8.263140	8.279446
11.448164	12.192363
8.216533	9.186628
9.316128	10.046697
8.156927	6.834792
9.951421	11.240598
9.059607	8.458446
10.476339	10.560461
7.548200	7.227127
9.432204	7.236705
9.402750	9.126413
11.188095	13.853426
9.520201	11.028131
8.884154	9.764071
8.961105	8.833117
8.549663	8.865765
10.111708	10.515462
9.024761	9.169368
7.904149	8.048756
9.240995	7.796142
8.126538	6.116125
7.442148	7.931335
9.486821	10.091359
9.834289	11.694720
9.009714	11.599170
9.761314	11.344083
6.993941	6.562988
8.659524	8.410107
7.685363	8.097297
7.793217	6.519109
8.883454	9.257347
8.781821	9.231980
7.946281	7.658978
8.523959	10.646480
9.031525	8.649648
8.317140	7.758978
9.192417	11.151218
8.408486	8.282182
10.327702	11.459048
8.389687	8.548727
8.642250	7.056870
8.833447	9.267638
8.805261	8.320281
9.726211	9.095997
8.477631	9.507530
9.738838	9.652110
8.272108	7.582696
9.258089	8.495931
8.334144	8.810766
8.150904	6.486032
7.259669	7.270156
11.034180	11.519954
10.705432	10.642527
8.388814	7.159137
8.559369	7.846284
7.187988	6.519313
8.811453	7.765900
8.492762	7.992941
8.739752	8.502909
10.150752	10.420295
7.062378	5.365289
8.448195	7.480000
10.224333	11.592750
9.533795	9.212845
9.519492	7.690501
9.661847	10.376189
7.963877	8.597193
10.184486	9.136709
8.505234	9.159210
8.187646	8.518690
9.167590	9.405917
8.612162	8.518755
10.970868	10.392229
9.603649	9.141095
9.704263	8.830178
9.657506	8.132449
9.337882	11.045306
9.521722	9.537764
8.954197	8.728179
8.635658	10.352662
8.910816	9.020317
9.900933	9.392002
10.247105	8.289649
9.571690	8.171237
7.388627	7.668071
8.354008	10.074590
9.775598	8.835696
8.768913	7.983604
8.330199	8.474098
8.169356	9.361172
10.346522	10.086434
7.976144	9.266702
8.429648	7.865824
11.261674	11.788587
10.051066	10.112425
8.954626	9.789343
8.382220	8.121012
9.820642	9.426441
8.125950	9.695087
8.646465	7.291808
8.190202	8.003737
8.773887	7.306175
8.731000	10.300436
9.163098	7.816769
9.456346	9.223922
9.645180	9.324053
8.835060	8.966915
9.325950	10.943248
9.941912	9.548535
9.282799	10.119488
9.567591	9.462164
8.529019	9.768001
9.314824	10.153727
8.264439	8.273860
8.307262	8.214036
9.122041	8.657861
8.404258	8.389365
7.828355	8.419433
9.803180	10.108286
8.662439	8.581953
8.883265	8.978377
8.012330	8.262451
9.420258	8.974878
7.015415	6.365940
9.888832	11.163036
9.677549	10.346431
8.410158	7.912899
9.464147	10.762900
7.067227	7.035717
9.320923	10.583089
9.056917	8.771241
8.110004	8.387789
10.310021	10.970014
8.211185	8.809627
8.942883	8.840746
9.479958	8.328700
8.973982	8.702291
8.519257	8.764855
9.424556	8.956911
7.222919	8.177787
8.257007	9.700619
9.778795	9.296134
8.028806	8.575974
9.886464	9.965076
9.090552	6.978930
9.605548	10.256751
9.959004	9.610229
8.308701	9.509124
7.748293	9.685933
8.311108	9.428114
9.697068	10.217956
9.582991	9.478773
9.167265	10.198412
10.329753	10.406602
8.908819	7.428789
10.072908	10.393294
7.992905	9.226629
8.907696	7.269366
8.421948	9.342968
7.481399	7.225033
10.358408	10.166130
8.786556	10.279943
9.658701	11.379367
10.167807	9.417552
8.653449	8.656681
8.020304	8.671270
8.364348	10.004068
9.119183	9.788199
8.405504	9.740580
11.020930	11.904350
9.755232	9.515713
10.059542	9.589748
8.727131	9.777998
7.666182	6.028642
8.870733	8.367501
9.340446	7.707269
9.919283	10.796813
7.905837	8.326034
10.181187	10.089865
8.797328	8.981988
8.466272	7.765032
10.335914	12.620539
9.365003	8.609115
8.011017	7.249489
10.923993	13.901513
7.074631	7.558720
9.824598	8.851297
8.861026	8.370857
10.127296	10.861535
10.548377	10.855695
8.880470	7.948761
8.901619	9.674705
7.813710	9.246912
10.128808	10.560668
11.096699	10.911644
8.551471	6.871514
8.907241	8.677815
10.571647	10.294838
8.815314	8.810725
8.453396	8.339296
9.594819	11.487580
10.714211	9.628908
7.428788	7.712869
10.892119	12.747752
9.024071	11.112692
7.803375	7.847038
8.521558	8.881848
9.742818	11.520203
9.832836	9.180396
8.703132	10.028498
9.905029	11.347606
10.037536	8.882688
8.629995	8.392863
9.583497	9.219663
8.781687	9.650598
9.344119	9.537024
10.407510	9.223929
7.244488	6.559021
10.643616	10.288383
8.757557	6.947901
10.784590	11.233350
10.028427	11.330033
7.968361	6.830308
8.925954	8.539113
7.738692	7.114987
8.192398	8.352016
10.412017	12.431122
8.208801	5.777678
7.820077	7.790720
9.542754	11.542541
6.817938	7.429229
7.365218	7.956797
9.274391	7.932700
9.546475	8.803412
7.471734	6.797870
8.016969	7.848070
8.852701	8.458114
8.215012	8.468330
6.975507	6.846980
9.435134	10.609700
9.228075	9.342622
8.388410	7.637856
7.111456	9.289163
9.403508	8.482654
9.133894	8.343575
10.670801	9.750821
9.983542	10.074537
10.012865	8.537017
8.929895	8.951909
7.666951	7.473615
9.493839	7.821783
8.894081	7.059413
9.593382	9.859732
9.126847	8.395700
9.532945	9.850696
9.459384	9.384213
8.982743	8.217062
10.107798	8.790772
10.563574	9.044890
8.278963	9.518790
8.734960	10.494129
9.597940	9.530895
10.025478	9.508270
10.335922	10.974063
8.404390	8.146748
7.108699	6.038469
8.873951	7.474227
8.731459	8.154455
8.795146	7.534687
6.407165	6.810352
9.979312	10.287430
8.786715	8.396736
10.753339	10.360567
10.508031	10.321976
10.636925	10.193797
10.614322	11.215420
8.916411	8.965286
8.112756	8.304769
10.833109	10.497542
8.319758	9.727691
9.945336	11.820097
10.150461	9.914715
10.185024	10.388722
9.793569	9.079955
10.590128	11.811596
8.505584	6.884282
10.461428	10.745439
8.755781	9.418427
7.488249	7.172072
10.238905	10.428659
9.887827	10.427821
8.529971	8.838217
8.375208	10.242837
8.901724	8.398304
8.607694	9.173198
8.691369	9.964261
9.584578	9.641546
10.265792	11.405078
7.592968	6.683355
8.692791	9.389031
7.589852	6.005793
10.550386	11.736584
8.578351	7.227055
7.526931	6.875134
8.577081	9.877115
9.272136	11.050928
10.300809	10.653059
8.642013	9.006681
9.720491	10.265202
9.029005	9.646928
8.736201	7.975603
8.672886	9.070759
8.370633	8.412170
9.483776	9.183341
6.790842	7.594992
9.842146	10.156810
9.563336	7.962532
8.724669	9.870732
9.012145	9.171326
9.116948	9.791167
6.219094	7.988420
9.468422	8.359975
8.825231	8.475208
9.572224	9.696428
9.609128	8.488175
9.428590	10.468998
8.293266	8.617701
9.423584	10.355688
9.240796	9.517228
10.915423	13.026252
10.854684	11.130866
9.226816	9.391796
9.580264	10.359235
7.289907	6.898208
9.338857	10.374025
9.523176	11.332190
10.162233	10.357396
8.873930	9.207398
8.607259	7.794804
8.852325	8.215797
8.077272	6.501042
8.169273	8.269613
6.806421	7.544423
8.793151	9.691549
11.640981	11.365702
9.544082	11.576545
9.009266	9.605596
9.726552	9.426719
9.495888	10.626624
8.683982	9.337864
8.322105	8.631099
8.887895	8.644931
8.662659	11.373025
9.263321	7.536016
7.802624	7.171625
8.773183	8.561565
8.730443	10.197596
8.942915	7.758383
8.057618	8.774996
8.112081	8.202349
10.378884	12.103755
9.248876	8.637249
9.739599	9.708576
8.126345	8.278487
8.894788	7.966117
9.683165	9.019221
10.886957	12.053843
9.668852	10.902132
7.486692	6.471138
8.794850	9.173609
8.835915	8.296727
9.443984	11.375344
8.696621	6.434580
9.645560	9.233722
9.623857	7.915590
10.840632	12.620268
7.298135	7.356141
9.639644	8.902389
9.849802	7.682624
10.609964	10.259615
9.768229	11.382811
7.646351	7.571849
10.230300	9.470859
8.224402	8.496866
6.879671	8.393648
7.976247	8.667221
9.183268	8.694550
11.471853	12.786280
10.428349	10.615726
8.090828	5.902504
9.738627	8.485792
8.139709	8.396333
9.508055	8.990529
8.857260	8.497732
8.902558	7.014433
9.660607	11.040833
8.772221	10.512150
11.020038	9.354134
7.918527	7.742062
7.630835	7.756260
11.043272	11.041613
9.299376	8.674157
9.795087	8.431837
9.415683	8.312101
7.942037	6.942913
9.724790	11.766496
10.222032	11.550876
8.894163	8.306020
8.394309	8.070420
9.012776	6.880548
9.661093	10.138921
9.896472	9.762372
9.135628	8.759928
8.762656	10.306028
8.602473	8.861956
10.085297	10.464774
10.644983	10.945767
9.034571	8.391668
8.602920	8.501944
8.224766	7.402758
8.755050	9.431085
9.669937	8.641049
10.693530	10.287124
9.462806	7.611153
9.287707	10.082363
10.941260	10.783728
9.263080	7.913328
10.167111	10.225338
8.783830	9.465345
8.958624	8.662136
9.841649	9.926781
7.205691	6.790638
8.629089	9.135461
7.469440	8.450442
8.179133	7.790434
8.083984	7.875520
9.271300	8.135359
8.652349	8.254397
7.983920	6.609684
7.836860	9.785238
7.418535	7.011256
8.458288	10.095364
9.387605	9.726911
8.663951	8.206705
10.146507	11.698577
8.937103	10.990924
11.218687	11.141945
8.363142	9.106936
7.877643	7.122922
9.620978	9.905689
9.509649	10.773209
6.748743	6.705385
9.300919	8.085029
9.332257	9.818791
7.898610	8.366643
9.841914	9.480675
6.920484	8.959501
8.544713	9.563136
8.162266	6.715277
8.659552	9.282008
10.673398	13.174824
9.024000	10.379238
8.183292	6.647572
10.544919	10.649602
7.201266	6.529605
9.557407	11.096821
8.304605	6.940929
9.742855	9.920897
10.024587	9.645222
10.002296	9.998940
8.965876	8.665419
7.823136	6.949572
8.125088	7.654065
6.569589	6.046863
10.195497	8.689129
11.730011	10.374221
8.739105	7.457571
9.820059	10.278526
9.547456	10.398198
8.375072	8.416302
8.889533	8.308929
8.861201	9.290408
12.677687	12.788463
9.100735	8.620537
7.728350	6.328219
7.955373	8.355028
8.733352	8.645414
10.257527	11.191813
9.246413	9.497014
9.745302	9.642035
7.785652	8.147621
7.431673	8.566399
8.654384	8.466701
8.475392	6.744677
9.968440	10.765192
10.163616	10.806963
10.238135	10.036636
9.902889	10.746730
9.523850	8.749708
9.214363	9.149178
9.266040	10.841502
8.494292	7.770942
10.821158	10.410192
8.645888	7.970308
9.885204	10.098080
9.084990	10.886349
9.277874	8.871449
8.135131	7.137064
7.917379	9.080522
9.685586	8.822850
8.558141	7.848112
9.502917	10.061255
6.409004	5.164774
10.149235	10.579951
7.847304	8.411351
8.846930	6.819939
8.675153	9.411147
9.476276	9.061508
11.099184	10.644263
8.792411	10.379405
8.400418	7.072706
8.555713	7.923805
8.024763	8.426993
8.642696	10.453412
7.906117	7.920408
8.793393	9.722878
8.280364	7.669854
9.387766	9.706245
9.626853	10.762499
10.163631	10.919007
9.375543	11.513524
9.309440	8.575699
10.055329	10.297255
8.706241	9.097172
10.032934	11.951897
10.812974	11.311435
10.352603	10.819865
8.276870	9.055403
8.397389	7.944434
9.371741	10.395790
10.825710	10.144099
9.158483	11.385382
10.658639	11.389856
8.091762	6.631039
10.734892	10.054598
11.535880	11.604912
9.799077	11.371677
8.478725	9.078455
9.399902	8.947744
7.305377	8.144973
7.613377	6.668798
10.681308	10.830845
9.973855	10.004133
9.369918	7.855433
8.838223	7.429033
9.521831	10.623930
9.724419	10.447452
8.890224	9.275923
9.932763	11.589953
10.839337	9.051250
8.497708	7.521701
8.440236	8.705670
9.063566	9.755744
8.449647	8.929485
8.554576	8.063231
10.348606	10.550718
5.985254	5.186844
9.931937	10.175582
9.854922	9.201393
9.114580	9.134215
10.334899	8.543604

  

import matplotlib
import 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

深入学习主成分分析(PCA)算法原理及其Python实现

标签:set   而且   val   0.12   就是   如何   pre   重要   最优   

原文地址:https://www.cnblogs.com/wj-1314/p/8032780.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!