参考资料:
PCA,很透彻
浅谈协方差矩阵
一、PCA降维本质:
将高维的数据通过线性变换投影到低维空间上去,前提条件是,找出最能够代表原始数据的投影方法,以保证降维后的数据不能失真,具体说就是,被PCA降掉的那些维度只能是噪声或是冗余的数据。
PCA的目的就是“降噪”和“去冗余”。“降噪”的目的就是使保留下来的维度间的相关性尽可能小,而“去冗余”的目的就是使保留下来的维度含有的“能量”即方差尽可能大。
协方差矩阵度量的是维度与维度之间的关系,而非样本与样本之间。协方差矩阵的主对角线上的元素是各个维度上的方差(即能量),其他元素是两两维度间的协方差(即相关性)。我们要的东西协方差矩阵都有了,先来看“降噪”,让保留下的不同维度间的相关性尽可能小,也就是说让协方差矩阵中非对角线元素都基本为零。达到这个目的的方式自然不用说,线代中奖的很明确——矩阵对角化。而对角化后得到的矩阵,其对角线上是协方差矩阵的特征值,它还有两个身份:首先,它还是各个维度上的新方差;其次,它是各个维度本身应该拥有的能量(能量的概念伴随特征值而来)。这也就是我们为何在前面称“方差”为“能量”的原因。也许第二点可能存在疑问,但我们应该注意到这个事实,通过对角化后,剩余维度间的相关性已经减到最弱,已经不会再受“噪声”的影响了,故此时拥有的能量应该比先前大了。看完了“降噪”,我们的“去冗余”还没完呢。对角化后的协方差矩阵,对角线上较小的新方差对应的就是那些该去掉的维度。
所以我们只取那些含有较大能量(特征值)的维度,其余的就舍掉即可。PCA的本质其实就是对角化协方差矩阵。
C=(ci,j,ci,j=cov(Dimi,Dimj))
举一个简单的四维的例子,假设数据集有{
x,y,z,g
}四个维度,则协方差矩阵为协方差矩阵(一个对称的矩阵,而且对角线是各个维度上的方差):
C=⎛⎝⎜⎜⎜⎜cov(x,x)cov(y,x)cov(z,x)cov(g,x)cov(x,y)cov(y,y)cov(z,y)cov(g,y)cov(x,z)cov(y,z)cov(z,z)cov(g,z)cov(x,g)cov(x,g)cov(z,g)cov(g,g)⎞⎠⎟⎟⎟⎟
补充:
度量各个维度偏离其均值的程度, 协方差可以这么来定义:
cov(X,G)=∑ni=1(Xi−X¯¯)(Gi−G¯)n−1
理解协方差矩阵的关键就在于牢记它计算的是不同维度之间的协方差,而不是不同样本之间。
降维的必要性
1.多重共线性–预测变量之间相互关联。多重共线性会导致解空间的不稳定,从而可能导致结果的不连贯。
2.高维空间本身具有稀疏性。一维正态分布有68%的值落于正负标准差之间,而在十维空间上只有0.02%。
3.过多的变量会妨碍查找规律的建立。
4.仅在变量层面上分析可能会忽略变量之间的潜在联系。例如几个预测变量可能落入仅反映数据某一方面特征的一个组内。 降维的目的:
1.减少预测变量的个数
2.确保这些变量是相互独立的
3.提供一个框架来解释结果 降维的方法有:主成分分析、因子分析、用户自定义复合等。
PCA(Principal Component Analysis)不仅仅是对高维数据进行降维,更重要的是经过降维去除了噪声,发现了数据中的模式。
PCA把原先的n个特征用数目更少的m个特征取代,新特征是旧特征的线性组合,这些线性组合最大化样本方差,尽量使新的m个特征互不相关。从旧特征到新特征的映射捕获数据中的固有变异性。
PCA理论基础
要解释为什么协方差矩阵的特征向量就是k维理想特征,我看到的有三个理论:分别是最大方差理论、最小错误理论和坐标轴相关度理论。这里简单探讨前两种,最后一种在讨论PCA意义时简单概述。
最大方差理论
在信号处理中认为信号具有较大的方差,噪声有较小的方差,信噪比就是信号与噪声的方差比,越大越好。如前面的图,样本在横轴上的投影方差较大,在纵轴上的投影方差较小,那么认为纵轴上的投影是由噪声引起的。
因此我们认为,最好的k维特征是将n维样本点转换为k维后,每一维上的样本方差都很大。
S = [1,0,0;
6,0,0;
0,2,0;
0,0,8]
S =
1 0 0
6 0 0
0 2 0
0 0 8
每行为一个样本,每一列为一个维度,得到样本矩阵S。我们先将样本进行中心化,即保证每个维度的均值为零,只需让矩阵的每一列减去对应的均值即可。很多算法都会先将样本中心化,以保证所有维度上的偏移都是以零为基点的。
S = S - repmat(mean(S),4,1);
S =
-0.7500 -0.5000 -2.0000
4.2500 -0.5000 -2.0000
-1.7500 1.5000 -2.0000
-1.7500 -0.5000 6.0000
C = cov(S);
C =
8.2500 -1.1667 -4.6667
-1.1667 1.0000 -1.3333
-4.6667 -1.3333 16.0000
[P,Lambda] = eig(C);
P =
-0.2370 0.8763 -0.4195
-0.9593 -0.2794 -0.0418
-0.1538 0.3925 0.9068
Lambda =
0.4979 0 0
0 6.5316 0
0 0 18.2205
P1 = P(1:3, 2:3)
P1 =
0.8763 -0.4195
-0.2794 -0.0418
0.3925 0.9068
S1 = S*P1;
S1 =
-1.3025 -1.4780
3.0788 -3.5757
-2.7377 -1.1421
0.9614 6.1957
matlab自带的主成分分析函数princomp:
[COEFF,SCORE] = princomp(S) % COEFF表示投影矩阵,SCORE表示投影后新样本矩阵。
可以参考学习的资料:
主元分析(PCA)理论分析及应用
http://www.360doc.com/content/10/0318/20/1024901_19297267.shtml
PCA for opencv
http://chyyeng.blog.163.com/blog/static/169182302012117105135710/
PCA的数学原理http://blog.codinglabs.org/articles/pca-tutorial.html
两个矩阵相乘的意义是将右边矩阵中的每一列列向量变换到左边矩阵中每一行行向量为基所表示的空间中去。