DataWhale 组队学习 2021.05 组队学习系列笔记三
补充内容:
一、PCA实现流程,设有 m 条 n 维数据:
S1. 将原始数据按列组成 n 行 m 列矩阵 X;
S2. 将 X 的每一行进行零均值化,即减去这一行的均值;
S3. 求出协方差矩阵 ;
S4. 求出协方差矩阵的特征值及对应的特征向量;
S5. 将特征向量按对应特征值大小从上到下按行排列成矩阵,取前 k 行组成矩阵 P;
S6. Y=PX 即为降维到 k 维后的数据。
二、sklearn实现及参数说明
- 函数原型及参数说明
相关包 import sklearn.decomposition
常用类 import sklearn.decomposition.PCA
其中,
sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False)
- n_components: int, float, None 或 string,PCA算法中所要保留的主成分个数,也即保留下来的特征个数,如果 n_components = 1,将把原始数据降到一维;如果赋值为string,如n_components='mle',将自动选取特征个数,使得满足所要求的方差百分比;如果没有赋值,默认为None,特征个数不会改变(特征数据本身会改变),此时n_components=min(样本数,特征数)。这个参数可以帮我们指定希望PCA降维后的特征维度数目。最常用的做法是直接指定降维到的维度数目。
- copy:True 或False,默认为True,即是否需要将原始训练数据复制。
- whiten:True 或False,默认为False,所谓白化, 就是对降维后的数据的每个特征进行归一化,让方差都为1。对于PCA降维本身来说,一般不需要白化。如果你PCA降维后有后续的数据处理动作,可以考虑白化。
- explained_variance_ratio_:返回所保留各个特征的方差百分比,如果n_components没有赋值,则所有特征都会返回一个数值且解释方差之和等于1。
- 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算法来降维。一般来说,使用默认值就够了。
除了这些输入参数外,有两个PCA类的成员值得关注。第一个是explained_variance_,它代表降维后的各主成分的方差值。方差值越大,则说明越是重要的主成分。第二个是explained_variance_ratio_,它代表降维后的各主成分的方差值占总方差值的比例,这个比例越大,则越是重要的主成分。
- PCA常用方法
fit(X): 用数据X来训练PCA模型。
fit_transform(X):用X来训练PCA模型,同时返回降维后的数据。
inverse_transform(newData) :将降维后的数据转换成原始数据,但可能不会完全一样,会有些许差别。
transform(X):将数据X转换成降维后的数据,当模型训练好后,对于新输入的数据,也可以用transform方法来降维。