主成分分析法的步骤,用 “人话” 来讲述,摆脱枯燥抽象的数学语言
看了很多主成分分析的的解释,都太理论了,完全get不到点,我又不是搞数学的。看不懂看不懂。
打算写一下主成分分析的步骤帮助我理解这个方法,至于里面为什么要用到方差,协方差这个东西,你需要去看看相关的文献说明,比如要解释为什么协方差矩阵的特征值最大的前 k 个特征向量就是k维理想特征,我看到的有三个理论:分别是最大方差理论、最小错误理论和坐标轴相关度理论。
这儿贴两篇文章,这篇的内容也主要来源于这两篇文章
https://www.cnblogs.com/jerrylead/archive/2011/04/18/2020209.html
https://www.cnblogs.com/jerrylead/archive/2011/04/18/2020216.html
而且啊,用方差最大来选择也不一定就适用于所有的数据降维,比如数据不满足高斯分布的时候,用方差最大来衡量的话显然是不明智的,所以有了独立主元分解(ICA)的提出。
扯远了,闲话不多说,将讲一下步骤,假设我们有m个n维的数据,我们想降维到K维(当然 K肯定小于等于n):
1、分别求m个数据在每一维上的均值,然后每个数据的每一维都减去每一维对应的均值。举个例子,3个2维数据(1,5),(3,4),(5,-3),我想降到1维,第一维的均值为(1+3+5)/3=3,第二维的均值为(5+4-3)/3=2,然后对应的减去均值变成了(-2,,3),(0,2),(2,-5)。
2、求特征协方差矩阵,多少维的数据,协方差矩阵就是几乘几大小的,比如三维的如下
主对角线是方差,其他位置是协方差。至于这个cov(x,x)、cov(x,y)怎么计算。首先说一下方差,方差说的是自己维度与自己维度的相关性。我们第一步不是把均值变成0了吗(这就是为什么要减均值),
Var(a)就是我们求得a维的方差,他等于m个数据在这个维度上的取值平方之和除以m。协方差又是啥玩意呢?
其实就是当前维度a与另一个维度b在m个数据上各自取值的积之和再除以m,方差也就是协方差的一种特例。那么显然cov(a,b)与cov(b,a)是完全等价的噻。我们计算的时候计算一次就好了。
3、求协方差矩阵的特征值和特征向量,刚才说了协方差矩阵是个n*n的方针,n是数据维度。而且cov(a,b)与cov(b,a)是完全等价的,这样的矩阵叫做实对称矩阵,实对称矩阵有一系列非常好的性质:
A、实对称矩阵不同特征值对应的特征向量必然正交。
B、设特征向量λ重数为r,则必然存在r个线性无关的特征向量对应于λ,因此可以将这r个特征向量单位正交化。
由上面两条可知,一个n行n列的实对称矩阵一定可以找到n个单位正交特征向量,设这n个特征向量为e1,e2,⋯,en。讲了这么多就是为了说明协方差矩阵的特征值和特征向量是一定存在求得出来的,而且特征向量还是正交的。
4、将特征值按照从大到小的顺序排序,选择其中最大的k个,然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵。没啥技术含量,也没啥可讲的
5、将样本点投影到选取的特征向量上。第一步假设样例数为m,特征数为n,减去均值后的样本矩阵为DataAdjust(m×n),则协方差矩阵是n×n,选取的k个特征向量组成的矩阵为EigenVectors(n×k)。那么投影后的数据FinalData为
FinalData(m×k) = DataAdjust(m×n) × EigenVectors(n×k)
最终得到的数据是m个k维的,原来的数据(处理过的,减掉均值的)是m个n维的,我们选的特征向量矩阵是n×k的,含义就是从n个特征值中选了最大的k个。那不就完成了从n维降到了k维吗。
PCA技术的一个很大的优点是,它是完全无参数限制的。在PCA的计算过程中完全不需要人为的设定参数或是根据任何经验模型对计算进行干预,最后的结果只与数据相关,与用户是独立的。
但是,这一点同时也可以看作是缺点。如果用户对观测对象有一定的先验知识,掌握了数据的一些特征,却无法通过参数化等方法对处理过程进行干预,可能会得不到预期的效果,效率也不高。所以有了kernel-PCA,它根据先验知识对数据预先进行非线性转换扩展了PCA能够处理的问题的范围,又可以结合一些先验约束,是比较流行的方法。感兴趣的自己去查查。
再贴一个PCA的数学原理的文章,讲的也蛮好,公式显示不出来的话,多F5刷新几次,或者 Shift+F5 刷新,二者的区别在于:
1. F5(ctrl+r):重载当前页面;
2. Shift+F5(ctrl+shift+F5):忽略缓存内容,重载当前页面。
文章链接: http://blog.codinglabs.org/articles/pca-tutorial.html
好了,到这儿就结束了,步骤就讲完了。