为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
Python

一:引入问题

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

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

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

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

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

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

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

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

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

二,数据降维

  假设三维空间中有一系列点,这些点分布在一个过原点的斜面上,如果你用自然坐标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为

clip_image011[4] 

  这里是FinalData(10*1) = DataAdjust(10*2矩阵)×特征向量clip_image009[7]

  得到结果为

  

  这样,就将原始样例的n维特征变成了k维,这k维就是原始特征在k维上的投影。

  上面的数据可以认为是learn和study特征融合为一个新的特征叫LS特征,该特征基本上代表了这两个特征,该过程如下图所示:

  正号表示预处理后的样本点,斜着的两条线就分别是正交的特征向量(由于协方差矩阵是对称的,因此其特征向量正交),最后一句矩阵乘法就是将原始样本点分别往特征向量对应的轴上做投影,下图是FinalData根据最大特征值对应的特征向量转化回去后的数据集形式,可看出是将DataAdjust样本点分别往特征向量对应的轴上做投影:

  

  如果取的k=2,那么结果是

     clip_image014[4]

  可见,若使用了所有特征向量得到的新的数据集,转化回去之后,与原来的数据集完全一样(只是坐标轴旋转)。

六,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,建议最好下载)

+ View Code?


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()

  

结果如下图:

https://img1.sycdn.imooc.com//5c3739df0001551c06450578.jpg

 

 参考文献:

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

原文出处:https://www.cnblogs.com/wj-1314/p/8032780.html

作者:战争热诚  

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消