PCA算法,从名字看也知道是用于降维的,通过提取主特征和主特征向量,丢掉次要的特征和特征向量,实现降维。
PCA算法流程(python代码实现流程):
1)零均值化
假如原始数据集为矩阵dataMat,dataMat中每一行代表一个样本,每一列代表一个特征。零均值化就是求每一列的平均值,然后该列上的所有数都减去这个均值。也就是说,这里零均值化是对每一个特征而言的,零均值化后,每个特征的均值变成0。
2)求协方差矩阵
numpy中的cov函数用于求协方差矩阵,参数rowvar很重要!若rowvar=0,说明传入的数据一行代表一个样本,若非0,说明传入的数据一列代表一个样本。因为newData每一行代表一个样本,所以将rowvar设置为0。
3)求得特征值和特征向量
调用numpy中的线性代数模块linalg中的eig函数,可以直接由covMat求得特征值和特征向量。
4)主成分个数选择
按照方差百分比来确定n的个数,用以保留最多信息,同时去除最多的噪声。
PCA算法流程:
PCA算法步骤(不涉及编程语言):
设有m条n维数据:
(1)将原始数据按列组成n行m列矩阵X;
(2)将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值;
(3)求出协方差矩阵;
(4)求出协方差矩阵的特征值以及对应的特征向量;
(5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P。(特征向量相当于方向基向量,对应特征向量的特征值相当原向量于在该基向量方向上的分量,因此特征值越大,原向量在该特征向量上的分量越大)
PCA降维的优缺点:
优点:
1. 对数据进行降维处理。PCA根据协方差矩阵特征值的大小进行排序,根据需要取前面最重要的部分,将后面的维度省去,可以达到降维从而简化模型或是对数据进行压缩的效果,同时又最大程度的保持了原有数据的信息。
2. 完全无参数限制。完全不需要人为的设定参数或是根据任何经验模型对计算进行干预,最后结果只与数据相关,与用户独立
缺点:
无参数限制同样也会成为它的缺点,如果用户通过观察得到了一些先验信息,掌握了数据的一些特征,但是无法通过参数化等方法进行干预,可能会得不到预期的效果。
降维具有如下一些优点:
- 1) 使得数据集更易使用。
- 2) 降低算法的计算开销。
- 3) 去除噪声。
- 4) 使得结果容易理解。
降维的算法有很多,比如奇异值分解(SVD)、主成分分析(PCA)、因子分析(FA)、独立成分分析(ICA)。
PCA计算主要步骤:
1、使用pca之前进行特征缩放;
2、计算特征矩阵X的协方差矩阵:
sigma = 1/m*XT*X
相关文献大部分公式都是要求计算协方差矩阵之前先将特征矩阵每一个维度减去平均值,这样是让数据分布以原点为中心,但并非必要,并不影响对数据分布方差的分析。
m 是样本数,即特征矩阵X的行数。X 的维度是 m×n,n 是特征向量的维度,即降维之前原始特征数。
得到的协方差矩阵sigma 是 n×n 的矩阵
3. 对协方差矩阵进行奇异值分解。
奇异值分解的几何意义这篇文章讲的特别好: https://blog.csdn.net/jinshengtao/article/details/18448355
[U, S, V] = svd(sigma);
U,S,V 都是n×n的矩阵
奇异值(特征值)描述了数据分布的形状。最大特征值(奇异值)对应的特征向量指向数据主要分布方向,即方差最大的方向!
->协方差矩阵特征值从小到大排列对应的特征向量指向数据分布的方差从大到小的方向。协方差矩阵特征值不受刚性变换的影响,而特征向量受刚性变换的影响!
其中 U 是 包含左奇异向量的矩阵,V 是包含右奇异向量的矩阵。S 是一个对角阵,对角线上的元素都是奇异值:s11, s22, s33, ..., snn,奇异值在S中从大到小排列. 特征向量即PCA需要将数据投影的方向!为什么PCA要将数据投影到特征向量的方向即方差最大的方向呢?因为数据的分布无非是用均值和方差来表征,PCA主要考虑方差,投影后保留大部分的方差就意味着保留数据分布的大部分特征!使得样本数据往低维投影后,能尽可能表征原始的数据。
参考博客:https://blog.csdn.net/wyl1813240346/article/details/78985259
参考博客:https://blog.csdn.net/program_developer/article/details/80632779