PCA的Matlab实现与分析

PCA(Principal Component Analysis)在机器学习领域中,是很常见的一种降维的方法。

PCA的主要思想:将原始高维数据集中的点,映射到低维的超平面中,映射(投影)之后的结果,就是经PCA降维之后的结果(PCA降维具有较高的不可解释性)。

很自然的一个问题是:如何将高维的数据映射到低维呢?什么样的映射方法才是最好的?

答:原始数据到新构建的超平面的距离都足够近(最近重构性)    or   原始数据在这个超平面上的投影尽可能分开(最大可分性)。

那么如何构建这个超平面呢?其实我理解的PCA降维,就是重新构建一个坐标系,将原始数据投影到新的坐标系当中去。具体有很多公式推导,建议翻阅周志华教授的机器学习一书中的第10章内容,讲解的很详细(但我没太看懂)。

由于我的主要目的是学会用PCA到我的任务中,并不研究如何对数据进行降维,所以下文我主要讲解Matlab中PCA的用法以及分析等。

设有需要降维的矩阵X(n行d列,n表示数据集中样本数,d表示特征数),Matlab中PCA用法如下:

[coeff,score,latent] = pca(X);

coeff是什么呢?根据官方文档,coeff是d*d的一个矩阵,是X矩阵的主成分系数,又称为载荷,周志华西瓜书中又将其称为投影矩阵,我理解可能就是新构建的坐标系。coeff这个矩阵跟我们任务相关性不大,知道是什么就行。

score是什么呢?score就是我们需要的了,score与原始X矩阵相对应,也是一个n*d的一个矩阵。根据官方文档的解释,score是原始数据X在主成分空间中的表示(那不就是在新构建的坐标系下的值嘛。。。说那么高大上,还叫做主成分分数,刚开始看还没看懂)。如果你需要将原始数据降维到2维,那你就选取score矩阵中的前两列就行,3维就选score中的前3列,etc。

latent是什么呢?latent又称为主成分方差,是原始数据X的协方差矩阵的特征值。要latent有什么用呢?这就是一个新问题。通常机器学习任务中,我们并不知道把原始数据降低到多少维度比较合适,那么我们可以用latent来帮助我们。latent是一个d行1列的矩阵。以latent的第一行第一列的值为例来说,它是一个实数,表示了如果只选用第一个特征的话,它包含了整个数据集多少的信息量(信息量指数据集的方差大小,方差越大,信息量越多)。如果我们选取了前两个特征,发现其所对应的latent值已经占了整个数据集的95%,那么我们就选取前两个特征就够了,依次类推。

扫描二维码关注公众号,回复: 14815055 查看本文章

下面我用一个例子来详细的描述一下这个过程。

本例中的数据集来源于http://odds.cs.stonybrook.edu/,用了其中的WBC数据集,是一个乳腺癌相关的数据集,用X来表示该数据集。X是一个377行30列的一个矩阵,一行表示一个患者的全部特征信息,每一列表示患者在该特征下的值(好像是乳腺细胞核的大小占比的数值,诸如此类)。我们用PCA来对该数据集进行降维与分析。

代码如下:

 [coeff,score,latent] = pca(X);

latent=[0.144945253673876,.....](转置)是30行一列的矩阵,我们把latent中的值用excel画个饼状图看看,分析一下。

图1. 不带数据标记绘制的latent饼状图

图2.带数据标记绘制的latent饼状图

从图1与图2中,我们可以发现,前5个特征所包含的信息量已经占了整个数据集的85%。如果任务要求不是很高的话,那么我们只需要选用score矩阵中的前5列就够了,剩下的25个特征就被PCA降掉了。

通过PCA降维可以消除掉数据集中意义不太大的特征,提高模型的训练速度,加快收敛,降低运算量等诸多好处。虽然降维之后的数据,相比于原始的数据肯定是丢失了某些信息,但一般来说,丢弃了也就丢弃了,因为丢弃的信息在一定程度上可以达到去噪的效果,同时也可以提高我们的采样密度。

关于PCA的方法推导,后面再继续研究。目前已经达到了我的任务需求,后面有空的话,详细推导一下PCA。

猜你喜欢

转载自blog.csdn.net/jinhualun911/article/details/117771807