PCA 简介
多元统计分析中普遍存在的困难中,有一个困难是多元数据的可视化。matlab 中的 plot 可以显示两个变量之间的关系,plot3 和surf 可以显示三维的不同。但是当有多于3个变量时,要可视化变量之间的关系就很困难了。
幸运的是,在一组多变量的数据中,很多变量常常是一起变动的。一个原因是很多变量是同一个驱动影响的结果。在很多系统中,只有少数几个这样的驱动,但是多余的仪器使我们测量了很多的系统变量。当这种情况发生的时候,你需要处理的就是冗余的信息。而你可以通过用一个简单的新变量代替这组变量来简化此问题。
PCA 是一种较为常用的降维技术,PCA 的思想是将n维特征映射到k维上,这k维是全新的正交特征。这k维特征称为主元,是重新构造出来的k维特征。在 PCA 中,数据从原来的坐标系转换到新的坐标系下,新的坐标系的选择与数据本身是密切相关的。其中,第一个新坐标轴选择的是原始数据中方差最大的方向,第二个新坐标轴选取的是与第一个坐标轴正交且具有最大方差的方向,依次类推,我们可以取到这样的k个坐标轴。
PCA 操作流程
- 去均值,即每一位特征减去各自的平均值(当然,为避免量纲以及数据数量级差异带来的影响,先标准化是必要的)
- 计算协方差矩阵
- 计算协方差矩阵的特征值与特征向量
- 对特征值从大到小排序
- 保留最大的k个特征向量
- 将数据转换到k个特征向量构建的新空间中
PCA 实例
考虑到实例的简洁性,这里只用二维数据。
假设二维数据为 data:
取均值:
- 去均值矩阵:
- 计算其协方差矩阵:
- 计算协方差矩阵的特征值和特征向量:
特征值为:
特征向量为:
-
对特征值进行排序(只有两个特征)
-
选择最大的特征值对应的特征向量:
-
转换到新的空间
由此,便实现了 PCA 降维操作。
MATLAB 实现 PCA
上面已经对 PCA 的算法过程做了详细说明,这里只针对 MATLAB 中的 PCA 函数作介绍并加以实例说明(详情也可参考 MATLAB 的PCA 文档,官方文档更加细致):
[coef,score,latent] = pca(x);
- 1
x:为要输入的 n 维原始数据。带入这个 matlab 自带函数,将会生成新的 n 维加工后的数据(即 score)。此数据与之前的 n 维原始数据一一对应。
score:生成的n维加工后的数据存在 score 里。它是对原始数据进行的分析,进而在新的坐标系下获得的数据。他将这 n 维数据按贡献率由大到小排列。(即在改变坐标系的情况下,又对 n 维数据排序)。
latent:是一维列向量,每一个数据是对应 score 里相应维的贡献率,因为数据有 n 维所以列向量有n个数据。由大到小排列(因为 score 也是按贡献率由大到小排列)。
coef:是系数矩阵。通过 cofe 可以知道x是怎样转换成 score 的。
则模型为从原始数据出发:
score = bsxfun(@minus,x,mean(x,1))coef; (作用:可以把测试数据通过此方法转变为新的坐标系)
逆变换: x = bsxfun(@plus,scoreinv(coef),mean(x,1))
代码示例(此处选择一个10维度的数据集):
%调用 pca 函数
[coef,score,latent,t2] = pca();
score
%测试score是否和score_test一样
score_test=bsxfun(@minus,x,mean(x,1))*coef;
score_test
latent=100*latent/sum(latent)%将latent总和统一为100,便于观察贡献率
pareto(latent);%调用 matlab 画排列图
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
几个注意点:
-
PCA 针对的是 feature extraction ,而不是 feature selection。PCA后会有贡献值,是输入者根据自己想要的贡献值进行维数的改变,进而生成数据。(一般大家会取贡献值在85%以上,要求高一点95%)。即在特征信息损失不多的情况下达到降维的目的。
-
主成分分析中 latent 显示的贡献值是加工后的数据的,并非原始数据。
-
PCA分析,只根据输入数据的特征进行主成分分析,与输出有多少类型,每个数据对应哪个类型无关。考虑与聚类的结合,PCA 与聚类结果没有直接的关系。原因:PCA只是降低维度,簇并不一定与维度绑定,PCA 的作用顶多就是去掉噪音,减少计算量,并不会剔除簇信息。
本文使用 文章同步助手 同步