用Python实现降维和聚类

     在这一篇以前的内容是《Factor Analysis》,因为很是理论,打算学完整个课程后再写。在写这篇以前,我阅读了PCA、SVD和LDA。这几个模型相近,却都有本身的特色。本篇打算先介绍PCA,至于他们之间的关系,只能是边学边体会了。PCA之前也叫作Principal factor analysis。函数

1. 问题学习

     真实的训练数据老是存在各类各样的问题:blog

一、 好比拿到一个汽车的样本,里面既有以“公里/每小时”度量的最大速度特征,也有“英里/小时”的最大速度特征,显然这两个特征有一个多余。排序

二、 拿到一个数学系的本科生期末考试成绩单,里面有三列,一列是对数学的兴趣程度,一列是复习时间,还有一列是考试成绩。咱们知道要学好数学,须要有浓厚的兴趣,因此第二项与第一项强相关,第三项和第二项也是强相关。那是否是能够合并第一项和第二项呢?图片

三、 拿到一个样本,特征很是多,而样例特别少,这样用回归去直接拟合很是困难,容易过分拟合。好比北京的房价:假设房子的特征是(大小、位置、朝向、是否学区房、建造年代、是否二手、层数、所在层数),搞了这么多特征,结果只有不到十个房子的样例。要拟合房子特征->房价的这么多特征,就会形成过分拟合。ip

四、 这个与第二个有点相似,假设在IR中咱们创建的文档-词项矩阵中,有两个词项为“learn”和“study”,在传统的向量空间模型中,认为二者独立。然而从语义的角度来说,二者是类似的,并且二者出现频率也相似,是否是能够合成为一个特征呢?ci

五、 在信号传输过程当中,因为信道不是理想的,信道另外一端收到的信号会有噪音扰动,那么怎么滤去这些噪音呢?文档

     回顾咱们以前介绍的《模型选择和规则化》,里面谈到的特征选择的问题。但在那篇中要剔除的特征主要是和类标签无关的特征。好比“学生的名字”就和他的“成绩”无关,使用的是互信息的方法。get

     而这里的特征不少是和类标签有关的,但里面存在噪声或者冗余。在这种状况下,须要一种特征降维的方法来减小特征数,减小噪音和冗余,减小过分拟合的可能性。数学

     下面探讨一种称做主成分分析(PCA)的方法来解决部分上述问题。PCA的思想是将n维特征映射到k维上(k<n),这k维是全新的正交特征。这k维特征称为主元,是从新构造出来的k维特征,而不是简单地从n维特征中去除其他n-k维特征。

2. PCA计算过程

     首先介绍PCA的计算过程:

     假设咱们获得的2维数据以下:

     clip_image001[4]

     行表明了样例,列表明特征,这里有10个样例,每一个样例两个特征。能够这样认为,有10篇文档,x是10篇文档中“learn”出现的TF-IDF,y是10篇文档中“study”出现的TF-IDF。也能够认为有10辆汽车,x是公里/小时的速度,y是英里/小时的速度,等等。

     第一步分别求x和y的平均值,而后对于全部的样例,都减去对应的均值。这里x的均值是1.81,y的均值是1.91,那么一个样例减去均值后即为(0.69,0.49),获得

     clip_image002[4]

     第二步,求特征协方差矩阵,若是数据是3维,那么协方差矩阵是

     clip_image003[4]

     这里只有x和y,求解得

     clip_image004[4]

     对角线上分别是x和y的方差,非对角线上是协方差。协方差大于0表示x和y如有一个增,另外一个也增;小于0表示一个增,一个减;协方差为0时,二者独立。协方差绝对值越大,二者对彼此的影响越大,反之越小。

     第三步,求协方差的特征值和特征向量,获得

     clip_image005[4]

     上面是两个特征值,下面是对应的特征向量,特征值0.0490833989对应特征向量为clip_image007[4],这里的特征向量都归一化为单位向量。

    第四步,将特征值按照从大到小的顺序排序,选择其中最大的k个,而后将其对应的k个特征向量分别做为列向量组成特征向量矩阵。

     这里特征值只有两个,咱们选择其中最大的那个,这里是1.28402771,对应的特征向量是clip_image009[6]

     第五步,将样本点投影到选取的特征向量上。假设样例数为m,特征数为n,减去均值后的样本矩阵为DataAdjust(m*n),协方差矩阵是n*n,选取的k个特征向量组成的矩阵为EigenVectors(n*k)。那么投影后的数据FinalData为

     clip_image011[4]

     这里是

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

     获得结果是

     clip_image012[4]

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

     上面的数据能够认为是learn和study特征融合为一个新的特征叫作LS特征,该特征基本上表明了这两个特征。

     上述过程有个图描述:

     clip_image013[4]

     正号表示预处理后的样本点,斜着的两条线就分别是正交的特征向量(因为协方差矩阵是对称的,所以其特征向量正交),最后一步的矩阵乘法就是将原始样本点分别往特征向量对应的轴上作投影。

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

     clip_image014[4]

     这就是通过PCA处理后的样本数据,水平轴(上面举例为LS特征)基本上能够表明所有样本点。整个过程看起来就像将坐标系作了旋转,固然二维能够图形化表示,高维就不行了。上面的若是k=1,那么只会留下这里的水平轴,轴上是全部点在该轴的投影。

     这样PCA的过程基本结束。在第一步减均值以后,其实应该还有一步对特征作方差归一化。好比一个特征是汽车速度(0到100),一个是汽车的座位数(2到6),显然第二个的方差比第一个小。所以,若是样本特征中存在这种状况,那么在第一步以后,求每一个特征的标准差clip_image016[6],而后对每一个样例在该特征下的数据除以clip_image016[7]

     概括一下,使用咱们以前熟悉的表示方法,在求协方差以前的步骤是:

     clip_image017[4]

     其中clip_image019[6]是样例,共m个,每一个样例n个特征,也就是说clip_image019[7]是n维向量。clip_image021[4]是第i个样例的第j个特征。clip_image023[4]是样例均值。clip_image025[4]是第j个特征的标准差。

     整个PCA过程貌似及其简单,就是求协方差的特征值和特征向量,而后作数据转换。可是有没有以为很神奇,为何求协方差的特征向量就是最理想的k维向量?其背后隐藏的意义是什么?整个PCA的意义是什么?

3. PCA理论基础

     要解释为何协方差矩阵的特征向量就是k维理想特征,我看到的有三个理论:分别是最大方差理论、最小错误理论和坐标轴相关度理论。这里简单探讨前两种,最后一种在讨论PCA意义时简单概述。

3.1 最大方差理论

     在信号处理中认为信号具备较大的方差,噪声有较小的方差,信噪比就是信号与噪声的方差比,越大越好。如前面的图,样本在横轴上的投影方差较大,在纵轴上的投影方差较小,那么认为纵轴上的投影是由噪声引发的。

所以咱们认为,最好的k维特征是将n维样本点转换为k维后,每一维上的样本方差都很大。

     好比下图有5个样本点:(已经作过预处理,均值为0,特征方差归一)

     clip_image026[4]

     下面将样本投影到某一维上,这里用一条过原点的直线表示(前处理的过程实质是将原点移到样本点的中心点)。

     clip_image028[4]

     假设咱们选择两条不一样的直线作投影,那么左右两条中哪一个好呢?根据咱们以前的方差最大化理论,左边的好,由于投影后的样本点之间方差最大。

     这里先解释一下投影的概念:

     QQ截图未命名

     红色点表示样例clip_image037[14],蓝色点表示clip_image037[15]在u上的投影,u是直线的斜率也是直线的方向向量,并且是单位向量。蓝色点是clip_image037[16]在u上的投影点,离原点的距离是clip_image039[4](即clip_image030[4]或者clip_image041[4])因为这些样本点(样例)的每一维特征均值都为0,所以投影到u上的样本点(只有一个到原点的距离值)的均值仍然是0。

     回到上面左右图中的左图,咱们要求的是最佳的u,使得投影后的样本点方差最大。

     因为投影后均值为0,所以方差为:

     clip_image042[4]

     中间那部分很熟悉啊,不就是样本特征的协方差矩阵么(clip_image037[17]的均值为0,通常协方差矩阵都除以m-1,这里用m)。

     用clip_image044[10]来表示clip_image046[4]clip_image048[6]表示clip_image050[4],那么上式写做

     clip_image052[4] 

     因为u是单位向量,即clip_image054[4],上式两边都左乘u得,clip_image056[4]

     即clip_image058[4]

     We got it!clip_image044[11]就是clip_image048[7]的特征值,u是特征向量。最佳的投影直线是特征值clip_image044[12]最大时对应的特征向量,其次是clip_image044[13]第二大对应的特征向量,依次类推。

     所以,咱们只须要对协方差矩阵进行特征值分解,获得的前k大特征值对应的特征向量就是最佳的k维新特征,并且这k维新特征是正交的。获得前k个u之后,样例clip_image037[18]经过如下变换能够获得新的样本。

     clip_image059[4]

     其中的第j维就是clip_image037[19]clip_image061[4]上的投影。

     经过选取最大的k个u,使得方差较小的特征(如噪声)被丢弃。

 

3.2 最小平方偏差理论

 

     clip_image001

     假设有这样的二维样本点(红色点),回顾咱们前面探讨的是求一条直线,使得样本点投影到直线上的点的方差最大。本质是求直线,那么度量直线求的好很差,不只仅只有方差最大化的方法。再回想咱们最开始学习的线性回归等,目的也是求一个线性函数使得直线可以最佳拟合样本点,那么咱们能不能认为最佳的直线就是回归后的直线呢?回归时咱们的最小二乘法度量的是样本点到直线的坐标轴距离。好比这个问题中,特征是x,类标签是y。回归时最小二乘法度量的是距离d。若是使用回归方法来度量最佳直线,那么就是直接在原始样本上作回归了,跟特征选择就没什么关系了。

     所以,咱们打算选用另一种评价直线好坏的方法,使用点到直线的距离d’来度量。

     如今有n个样本点clip_image003,每一个样本点为m维(这节内容中使用的符号与上面的不太一致,须要从新理解符号的意义)。将样本点clip_image005在直线上的投影记为clip_image007,那么咱们就是要最小化

     clip_image009

     这个公式称做最小平方偏差(Least Squared Error)。

     而肯定一条直线,通常只须要肯定一个点,而且肯定方向便可。

     第一步肯定点:

     假设要在空间中找一点clip_image011来表明这n个样本点,“表明”这个词不是量化的,所以要量化的话,咱们就是要找一个m维的点clip_image011[1],使得

     clip_image012

     最小。其中clip_image014是平方错误评价函数(squared-error criterion function),假设m为n个样本点的均值:

     clip_image015

     那么平方错误能够写做:

     clip_image017

     后项与clip_image019无关,看作常量,而clip_image021,所以最小化clip_image014[1]时,

     clip_image023 

     clip_image019[1]是样本点均值。

     第二步肯定方向:

     咱们从clip_image019[2]拉出要求的直线(这条直线要过点m),假设直线的方向是单位向量e。那么直线上任意一点,好比clip_image007[1]就能够用点me来表示

     clip_image025 

     其中clip_image027clip_image029到点m的距离。

     咱们从新定义最小平方偏差:

     clip_image030

     这里的k只是至关于iclip_image032就是最小平方偏差函数,其中的未知参数是clip_image034e

     其实是求clip_image032[1]的最小值。首先将上式展开:

     clip_image036

     咱们首先固定e,将其看作是常量,clip_image038,而后对clip_image027[1]进行求导,得

     clip_image039

     这个结果意思是说,若是知道了e,那么将clip_image041e作内积,就能够知道了clip_image043e上的投影离m的长度距离,不过这个结果不用求都知道。

     而后是固定clip_image027[2],对e求偏导数,咱们先将公式(8)代入clip_image032[2],得 

     clip_image044

     其中clip_image045 与协方差矩阵相似,只是缺乏个分母n-1,咱们称之为散列矩阵(scatter matrix)。

     而后能够对e求偏导数,可是e须要首先知足clip_image038[1],引入拉格朗日乘子clip_image047,来使clip_image049最大(clip_image032[3]最小),令

     clip_image050

     求偏导

     clip_image051

     这里存在对向量求导数的技巧,方法这里很少作介绍。能够去看一些关于矩阵微积分的资料,这里求导时能够将clip_image049[1]看做是clip_image053,将clip_image055看作是clip_image057

     导数等于0时,得

     clip_image058

     两边除以n-1就变成了,对协方差矩阵求特征值向量了。

     从不一样的思路出发,最后获得同一个结果,对协方差矩阵求特征向量,求得后特征向量上就成为了新的坐标,以下图:

     clip_image059

     这时候点都汇集在新的坐标轴周围,由于咱们使用的最小平方偏差的意义就在此。

4. PCA理论意义

     PCA将n个特征降维到k个,能够用来进行数据压缩,若是100维的向量最后能够用10维来表示,那么压缩率为90%。一样图像处理领域的KL变换使用PCA作图像压缩。但PCA要保证降维后,还要保证数据的特性损失最小。再看回顾一下PCA的效果。通过PCA处理后,二维数据投影到一维上能够有如下几种状况:

     clip_image060

     咱们认为左图好,一方面是投影后方差最大,一方面是点到直线的距离平方和最小,并且直线过样本点的中心点。为何右边的投影效果比较差?直觉是由于坐标轴之间相关,以致于去掉一个坐标轴,就会使得坐标点没法被单独一个坐标轴肯定。

     PCA获得的k个坐标轴其实是k个特征向量,因为协方差矩阵对称,所以k个特征向量正交。看下面的计算过程。

     假设咱们仍是用clip_image062来表示样例,m个样例,n个特征。特征向量为eclip_image064表示第i个特征向量的第1维。那么原始样本特征方程能够用下面式子来表示:

     前面两个矩阵乘积就是协方差矩阵clip_image066(除以m后),原始的样本矩阵A是第二个矩阵m*n。

     clip_image068

     上式能够简写为clip_image070
 

     咱们最后获得的投影结果是clip_image072,E是k个特征向量组成的矩阵,展开以下:

     clip_image074

     获得的新的样例矩阵就是m个样例到k个特征向量的投影,也是这k个特征向量的线性组合。e之间是正交的。从矩阵乘法中能够看出,PCA所作的变换是将原始样本点(n维),投影到k个正交的坐标系中去,丢弃其余维度的信息。举个例子,假设宇宙是n维的(霍金说是11维的),咱们获得银河系中每一个星星的坐标(相对于银河系中心的n维向量),然而咱们想用二维坐标去逼近这些样本点,假设算出来的协方差矩阵的特征向量分别是图中的水平和竖直方向,那么咱们建议以银河系中心为原点的x和y坐标轴,全部的星星都投影到x和y上,获得下面的图片。然而咱们丢弃了每一个星星离咱们的远近距离等信息。

相关文章
相关标签/搜索