PCA算法思路:
首先利用样本集及特征构建一个样本矩阵,然后利用样本矩阵计算得到一个协方差矩阵,再计算协方差矩阵的特征值和特征向量,保留特征值前k个大的对应的特征向量作为新的维度方向,再将原始样本数据转换到新的空间维度。(他非常巧妙地利用协方差矩阵来计算出样本集在不同方向上的分散程度,利用方差最大的方向作为样本集的主方向)
上述提到的k(k<n,n是n维特征,)这个k维是全新的正交特征,这k维特征称为主成分,是重新构造出来的k维特征,而不是简单的从n维特征中去除其余n-k维特征。
为什么要用到PCA:
PCA算法是专门用来对高维数据进行降维,因此算法的核心就是在于找出数据变化的主方向和次方向。比如下图二维平面内有一些点,那么向量u1的方向可以认为是该数据的主方向,而u2是次方向。
去均值:
为什么要去均值:
这主要是去除均值对变化的影响,减去均值后数据的信息量没有变化,即数据的区分度(方差)是不变的。如果不去均值,第一主成分,可能会或多或少的与均值有关。
归一化:
将不同特征的数据范围归一化到同一范围中,一般做法是将每个值除以当前维的最大值。
(将每一维特征的均值中心化,方差归一化)
对于组成的协方差矩阵求取的特征值与特征向量:
特征值越大的特征向量,样本集在该方向上的变化越大。(因为协方差矩阵计算出来的特征值为其特征向量上的样本集的方差,当方差越大说明数据集在该特征向量方向上越分散,变化越大,所以该方向就可以用来作为数据集的主方向。)对于由特征向量组成的矩阵我们称为特征矩阵U,特征矩阵是一个正交矩阵,即满足(特征向量之间相互正交,说明各特征之间相关性最小,基本接近0。独立===>不相关<===>协方差为0
计算新维度下的每个样本对应的新样本数据值:
已经得到了数据变化的主次方向,现在需要计算样本在每个特征向量上的长度,对于原始样本x,其在特征向量u1方向上的长度为:。
PCA具有缩放不变性:
所有的特征分量被放大或缩小相同的倍数,PCA输出的特征向量不会发生变化。
例子分析:
比如下边有3个维度为4的样本数据(X,Y,Z,A)首先假设XYZA之间互不相关。
样本编号 | X | Y | Z | A |
1 | 1 | 1 | 12 | 30 |
2 | 90 | 2 | 13 | 30 |
3 | 847 | 3 | 14 | 30 |
由上边几个简单的样本我们就可以看出XYZ作为主成分,X可以作为该样本的第一主成分,因为分布比较广。
但是如果每一个维度我们都不能明显的看出他们分布的差异性,意思就是在同一个维度上每个样本之间的差值都非常小,那么我们就不能一眼看出该样本的主成分。
通过如下一些二维数据我们走一遍PCA的过程:
原始样本编号 | x | y |
1 | 2.5 | 2.4 |
2 | 0.5 | 0.7 |
3 | 2.2 | 2.9 |
4 | 1.9 | 2.2 |
5 | 3.1 | 3.0 |
6 | 2.3 | 2.7 |
7 | 2 | 1.6 |
8 | 1 | 1.1 |
9 | 1.5 | 1.6 |
10 | 1.1 | 0.9 |
第一步:求x、y的均值。=1.81,,得到去均值之后的样本如下:
去均值后的样本个数 | x | y |
1 | 0.69 | 0.49 |
2 | -1.31 | -1.21 |
3 | 0.39 | 0.99 |
4 | 0.09 | 0.29 |
5 | 1.29 | 1.09 |
6 | 0.49 | 0.79 |
7 | 0.19 | -0.31 |
8 | -0.81 | -0.81 |
9 | -0.31 | -0.31 |
10 | -0.71 | -1.01 |
第二步:求x,y的协方差矩阵:
求的协方差矩阵,对角线上分别是方差,非对角线上是协方差,协方差是衡量两个变量同时变化的变化程度(协方差大于0表示,x和y若一个增另外一个也增;小于0表示一个增,一个相应的减。如果x和y是统计独立的,那么两者之间的协方差就是0;相反协方差是0并不能说明两者是独立的。而且两者协方差的绝对值越大,那么两者对彼此的影响就越大,反之越小。协方差是没有单位的量。)
第三步:求协方差的特征值和特征向量,得到
第四步:将特征值按照从大到小的顺序排序,选择其中最大的k个,然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵。
这里特征值只有两个,我们选择其中最大的那个,这里是1.28402771,对应的特征向量是(-0.677873399, -0.735178656)T。
第五步:将样本点投影到选取的特征向量上。假设样例数为m(此处是10),特征数为n(此处是2),减去均值后的样本矩阵为DataAdjust(m*n)(此处是10x2),协方差矩阵是n*n(此处是2x2),选取的k个特征向量组成的矩阵为EigenVectors(n*k)(此处是2x1)。那么投影后的数据FinalData为
FinalData(10*1) = DataAdjust(10*2矩阵) x 特征向量(-0.677873399, -0.735178656)T(此步的矩阵乘法就是将原始样本点分别往特征向量对应的轴上做投影)
最后将每一个去均值后的数据点与选择的k个特征向量做乘后的结果为:(10x2)与(2x1)矩阵得到(10x1)
Transformed Data(一个维度) |
-0.828 |
1.778 |
-0.992 |
-0.274 |
-1.676 |
-0.913 |
-0.991 |
1.144 |
0.438 |
1.224 |
这样,就将原始样例的n维特征变成了k维,这k维就是原始特征在k维上的投影。
最后例子参照博客:https://blog.csdn.net/zhongkelee/article/details/44064401