在本篇文章中,我们将介绍如何使用sk_learn这一机器学习工具包进行PCA降维的操作。
PCA:主成份分析
1. 简介
基本思路: 方差越大,说明该向量的数据分布越分散,因此我们通常选择原始数据中方差最大的向量(特征)来作为新特征集合的第一条坐标轴,并以此为基础,第二条坐标轴应与第一条坐标轴正交(线性无关),且方差最大,以此类推;
总结一下 PCA 的算法步骤:
设有 m 条 n 维数据。
将原始数据按列组成 n 行 m 列矩阵 X;
将 X 的每一行进行零均值化,即减去这一行的均值;
求出协方差矩阵 ;
求出协方差矩阵的特征值及对应的特征向量;将特征向量按对应特征值大小从上到下按行排列成矩阵,取前 k 行组成矩阵 P;
即为降维到 k 维后的数据。
具体推导详见https://zhuanlan.zhihu.com/p/77151308【必看!!!!!!】
2. 代码实现
importsklearn.decompositionassk_decompositionpca=sk_decomposition.PCA(n_components=3,whiten=False,svd_solver='auto')pca.fit(fr)result=pca.transform(fr)print(result)print('降维后的各主成分的方差值占总方差值的比例',pca.explained_variance_ratio_)print('降维后的各主成分的方差值',pca.explained_variance_)print('降维后的特征数',pca.n_components_)
3. sklearn的PCA详解
3.1 参数
n_components:这个参数可以帮我们指定希望PCA降维后的特征维度数目。最常用的做法是直接指定降维到的维度数目,此时n_components是一个大于等于1的整数。当然,我们也可以指定主成分的方差和所占的最小比例阈值,让PCA类自己去根据样本特征方差来决定降维到的维度数,此时n_components是一个(0,1]之间的数。当然,我们还可以将参数设置为"mle", 此时PCA类会用MLE算法根据特征的方差分布情况自己去选择一定数量的主成分特征来降维。我们也可以用默认值,即不输入n_components,此时n_components=min(样本数,特征数);
whiten :判断是否进行白化。所谓白化,就是对降维后的数据的每个特征进行归一化,让方差都为1.对于PCA降维本身来说,一般不需要白化。如果你PCA降维后有后续的数据处理动作,可以考虑白化。默认值是False,即不进行白化;
svd_solver:即指定奇异值分解SVD的方法,由于特征分解是奇异值分解SVD的一个特例,一般的PCA库都是基于SVD实现的。有4个可以选择的值:{‘auto’, ‘full’, ‘arpack’, ‘randomized’}。randomized一般适用于数据量大,数据维度多同时主成分数目比例又较低的PCA降维,它使用了一些加快SVD的随机算法。 full则是传统意义上的SVD,使用了scipy库对应的实现。arpack和randomized的适用场景类似,区别是randomized使用的是scikit-learn自己的SVD实现,而arpack直接使用了scipy库的sparse SVD实现。默认是auto,即PCA类会自己去在前面讲到的三种算法里面去权衡,选择一个合适的SVD算法来降维。一般来说,使用默认值就够了;
3.2 属性
print('降维后的各主成分的方差值占总方差值的比例',pca.explained_variance_ratio_)print('降维后的各主成分的方差值',pca.explained_variance_)print('降维后的特征数',pca.n_components_)