主成分分析PCA

版权声明:本文为博主原创文章,转载或者引用请务必注明作者和出处,尊重原创,谢谢合作 https://blog.csdn.net/u012328159/article/details/51423544

主成分分析(Principal Components Analysis,PCA)


PCA是一种典型的无监督线性降维方法。在介绍主成分分析(PCA)之前,我们不妨想想为什么要用PCA?谈到这个问题,我想先介绍两个概念:维灾难(Curve of  Dimensionality)和维规约(Dimensionality Reduction)。下面就来看看维灾难和维规约:

一、使用PCA的动机
  • 维灾难:     一般我们为了获得更好的分类精度,会选择增加一些特征,但是当特征数量达到一定数量后,增加特征不光不能提高分类精度反而导致分类精度的下降。所谓维灾难就是随着特征维度的增加计算开销急剧增加,而分类精度下降(或者聚类质量下降)。下面用一张图来表示下分类器性能和特征维度之间的关系(图来自:Vincent Spruyt):



从上图能够看出,随着特征维度的增加,分类器性能会提升,但是到达某个临界点后,分类器性能会急剧下降。而且随着特征维度的增加训练模型的时间开销往往很大。
  • 维规约:   所谓维规约就是降低特征维度。维规约的好处体现在一下几个方面:(1)维度减少能够改善模型性能;(2)使数据集更好理解,因此较低的特征维度可以更容易数据可视化;(3)降低了训练模型的时间开销和节省存储空间。维规约最常用的技术就是主成分分析(PCA)。当然降低维度还可以使用特征选择(feature selection),这个以后的博客应该可以写到(参见博客:http://blog.csdn.net/u012328159/article/details/53954522)。
二、PCA算法
PCA主要通过把数据从高维映射到低维来降低特征维度。我们来看一个把二维数据降到一维的例子:




PCA的优化目的就是在高维数据中找到一个超平面使正交距离(不知道这个翻译恰当不。。。还是给出英文原词:orthogonal distance)(即上图中的虚线)之和最小,周志华的西瓜书中用“最近重构性”(样本点到这个超平面的距离足够近)来描述。
因此可以这样描述:reduce from n-dimension to k-dimension: find k vectors onto which to project the data,so as to minimize the projection error.




PCA还应具有两一个性质:最大可分性(样本点在超平面上的投影应尽可能分开),就是使投影后样本点的方差最大。如下图所示:

如上图所示红线使所有样本点的投影尽可能的分开,其方差要大于灰色线。

下面来看下PCA算法的流程:
  • 对于给定的训练集,先进行下数据预处理(feature scaling或者mean normalization):,然后令
  • 计算协方差矩阵(convariance matrix):     注: 是Sigma不是求和运算符
  • 计算协方差矩阵的特征向量(对协方差矩阵做奇异值分解):      svd为奇异值分解(singular value decomposition),在MATLAB/Octave中svd()函数为奇异值分解函数。来看看奇异值分解的定义:设A为m*n阶矩阵,则存在m阶酉阵U和n阶酉阵V,使得:,S为与A同阶的对角阵(由A的奇异值组成),非负按降序排列。                                                                     因为这里为方阵,所以U=V。
  • PCA的目的是取前K个特征值对应的特征向量(特征值从大到小排列),得到投影矩阵。

总结一下以上的算法流程得到:




三、选择主成分的个数(需要降到的维数K)
当我们使用PCA算法把特征维度从n降到K时,维数K通常要我们自己指定,那么该如何选择维数K呢?先来定义两个概念:
  • average squared projection error:,其中  为映射值。
  • total variation in the data:
然后选取使下式成立的最小的K值:



如果t取0.01,则代表该PCA算法保留了99%的差异性(99% of variance is retained)。
而经过二中通过svd()函数的奇异值分解,对于给定的K上式还可以更简单的写成:


其中:


四、应用PCA的建议
  • 对于过拟合问题,不应该使用PCA去降低过拟合,而是应该使用正则化项去避免过拟合。
  • 在训练集中找出PCA的主成分,(可以看做为映射 mapping),然后应用到测试集和交叉验证集中。而不是对所有数据集使用PCA然后再划分训练集,测试集和交叉验证集。
阅读更多

没有更多推荐了,返回首页