在讲解PCA之前,首先提供一些关于矩阵的小知识
均值:
协方差:
推导:
cov(x,y)=E(x−Ex)(y−Ey)
=E(xy−yEx−xEy+ExEy)
=Exy−ExEy
=cov(y,x)
实对称矩阵的性质:
- 实对称矩阵不同特征值对应的特征向量都是正交的
- 实对称矩阵的特征值都是实数,特征向量都是实向量
- N阶实对称矩阵必可以对角化,且相似对角矩阵上的元素即为矩阵本身的特征值。
协方差矩阵:
假设数据有三个维度{x,y,z},则协方差矩阵为:
可见协方差矩阵也是实对称矩阵,因而,上述实对称矩阵的性质协方差矩阵也都有。
PCA(principal components analysis)
百度百科对PCA解释为:主成分分析(Principal Component Analysis,PCA), 是一种统计方法。通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。
应用:对原有数据进行简化,即找出最有效的元素和结构,如图像,基因数据,视频,音频,化工等高维数据。
目标:PCA目标是使用使用另一组基去重新描绘得到的数据空间,新的基要尽可能揭示原有数据的关系。
本质:实际上是K-L变换(卡洛南-洛伊(Karhunen-Loeve)变换),又名:最优正交变换
注:K-L变换在http://www.cnblogs.com/liu-jun/archive/2013/03/20/2970132.html 中有详细介绍。
PCA算法是寻找一个低维空间来尽可能的表现原始数据(将原始数据进行投影,类似于向量投影【|A|cos θ 】 )。从下图中可以看出, u1是数据变化的主方向,而 u2是次方向。
PCA计算流程
有了K-L变换的知识做铺垫后,接下来提供PCA具体的计算过程
- 数据标准化
为什么要进行数据标准化,最主要的原因是消除量纲(即单位)带来的差异。常见的数据标准化方法有 0-1标准化,最大最小标准化。 - 计算协方差矩阵
设标准化的数据矩阵为X,则协方差矩阵 cov(X,X)=1nXTX - 求取协方差矩阵的特征值和特征向量
在matlab或者python里面都有相应的求特征值和特征向量的函数,如,matlab中可直接使用eig()这个函数求取特征值和特征向量 - 对特征值从大到小排序,依据主元贡献率贺主元个数得到相应的的特征向量
接下来便是如何计算贡献率和计算主元个数了
贡献率是分析经济效益的一个指标。它是指有效或有用成果数量与资源消耗及占用量之比,即产出量与投入量之比,或所得量与所费量之比。
主元:特征值按从大到小顺序排序后的特征向量
主元贡献率 : 特征值∑特征值
X为标准化矩阵
za(:,i)=A*eigenvectors1(:,i);
设d1是按大到小排序好的特征值矩阵(1*m)
Gx=d1./sum(d1)
If sum(GX(i))>0.99 #i为主元个数
break;
实例分析
MATLAB中自带的PCA函数
[COEFF, SCORE, LATENT, TSQUARED] = princomp(A) ;
说明:
COFFEE即是排序后特征向量矩阵(eigenvectors1)
LATENT即是排序后对应的特征值(eigenvalues)
SCORE即是未按特征值重要性级别排除删除特征值而计算出的主元
总结:
1.协方差矩阵计算的是不同维度的协方差,而不是不同样本的协方差。
2.样本的每一行代表的是一个样本,每一列代表的是一个维度
提问
样本的数量一定要比样本的特征维数多么?如果不是?为什么?
PCA按照贡献率忽略掉一些特征属性,那么有没有可能它所忽略的投影方向有可能刚好包含了重要的可分性信息?