PCA主成分分析
好久没更新博客了,今天想写一下我对主成分分析(Principal components analysis)的理解。最开始接触到主成分分析(PCA for short)是在有关高光谱图像分类的论文中,PCA是作为对照方法凸显文中所提出的方法的优越性的。(感觉PCA好惨......)这同样也说明了,PCA应该是一个很经典,应用面很广的方法,并且性能也很好~~~正所谓木秀于林,风必摧之;PCA在我看的那几篇论文中总是作为陪衬,在这里我要为它正名~~~~(卧槽,正义属性满满啊)。废话少说,下面是正题。
在正式介绍PCA之前,我们先来想像一些平时在训练算法的过程中所遇到的情况。这里的情况是指数据的情况。Andrew Ng不是说过吗,当我们去解决一个机器学习问题时,我们可能会把大量的时间都花在观察数据上。可见,数据对整个算法有着不可比拟的重要性。但是在现实中,训练数据总是会存在各种的问题。而数据最重要的就是特征喽~~~这里引用博客园用户JerryLead的几个例子进行说明:
1、 比如拿到一个汽车的样本,里面既有以“千米/每小时”度量的最大速度特征,也有“英里/小时”的最大速度特征,显然这两个特征有一个多余。
2、 拿到一个数学系的本科生期末考试成绩单,里面有三列,一列是对数学的兴趣程度,一列是复习时间,还有一列是考试成绩。我们知道要学好数学,需要有浓厚的兴趣,所以第三项与第一项强相关,第三项和第二项也是强相关。那是不是可以合并第一项和第二项呢?
3、 拿到一个样本,特征非常多,而样例特别少,这样用回归去直接拟合非常困难,容易过度拟合。比如北京的房价:假设房子的特征是(大小、位置、朝向、是否学区房、建造年代、是否二手、层数、所在层数),搞了这么多特征,结果只有不到十个房子的样例。要拟合房子特征->房价的这么多特征,就会造成过度拟合。
4、 这个与第二个有点类似,假设在IR中我们建立的文档-词项矩阵中,有两个词项为“learn”和“study”,在传统的向量空间模型中,认为两者独立。然而从语义的角度来讲,两者是相似的,而且两者出现频率也类似,是不是可以合成为一个特征呢?
在上面的例子中,我们可以看到有很多数据的特征是冗余的,它们之间是有联系的。那我们就可以利用这些特征之间的内在联系来减少特征的维数,降低过拟合的风险。
咳咳,上面的大神举得例子确实很精辟,那下面我也用高光谱这个task进行一下说明(装逼模式已开启,前方高能预警,非战斗人员立即撤离!!!):在高光谱图像分类领域主要是有两个关键点,一是由于高光谱图象是采集了几百个通道(也就是波段)的光谱信息,这就造成了单一像素点特征维数过高;二是标记样本成本太高,所以只能借助极少量的标记样本来完成分类任务。在这里,我们只关心第一点。
下面我们来正式介绍主成分分析(PCA),它可以解决部分上述问题哦~~~PCA的思想是将n维特征映射到k维上(n>k),这k维是全新的正交特征。这k维特征称为主元,是重新构造出来的k维特征,而不是简单地从n维特征中去除其余n-k维特征所得到的特征。也就是说,在原来的n维特征中,是不存在我们后面用的k维特征的。
下面我们说一说PCA的计算过程,不得不说,第一次见到这个过程,感觉真是不一般的怪异...(这里以二维特征为例,数据集为Andrew Ng的q1x.dat)
第一步,分别求x和y的平均值,然后对于所有的样例,都减去对应的均值。
第二步,求特征协方差矩阵,若特征为三维,则协方差矩阵为:
,这里特征为二维,协方差矩阵为:。其中。
第三步,求协方差的特征值和特征向量。
第四步,将特征值按照从大到小的顺序排序,选择其中最大的k个,然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵。
第五步,将样本点投影到选取的特征向量上。假设样例数为m,特征数为n,减去均值后的样本矩阵为DataAdjust(m*n),协方差矩阵是n*n,选取的k个特征向量组成的矩阵为EigenVectors(n*k)。那么投影后的数据FinalData为
这样,就将原始样例的n维特征变成了k维,这k维就是原始特征在k维上的投影。上面得到的数据可以认为是learn和study特征融合为一个新的特征叫做LS特征,该特征基本上代表了这两个特征。
下面是实验结果,我用的是Andrew Ng的数据集q1x.dat,共有99个数据,每个数据有两个特征。序号1-50的数据为类型1(类标签为0);序号为51-99的数据为类型2(类标签为1)。将降维之后的特征用散点图表示出来,如下所示:
可以发现,数据可以被明显的分为两类。下面附上源代码(matlab):
function PCA load q1x.dat; mean1=sum(q1x(:,1))/99; mean2=sum(q1x(:,2))/99; qq=ones(99,2); sum1=0; qq(:,1)=q1x(:,1)-mean1; qq(:,2)=q1x(:,2)-mean2;%分别求x和y的平均值,然后对于所有的样例,都减去对应的均值。 cov1=sum(power(qq(:,1),2))/98; cov4=sum(power(qq(:,2),2))/98; for i=1:99 sum1=qq(i,1)*qq(i,2)+sum1; end cov2=sum1/98; covx=[cov1 cov2;cov2 cov4];%求特征协方差矩阵 [V,D]=eig(covx)%求协方差的特征值和特征向量
版权声明:本文为博主原创文章,未经博主允许不得转载。