1.PCA简介
PCA作为降维最重要的方法之一,在数据压缩消除冗余和数据噪音消除等领域都有广泛的应用。PCA的思想就是将高维数据投影到低维,一般基于两个标准选择投影方向:
- 基于最小投影距离
样本点到投影超平面的距离足够近
- 基于最大投影方差
样本点投影在超平面上的方差足够大,能够竟可能的分开,即方差最大方向的分解
ps:什么情况下需要进行降维?
数据集特征数较多,导致数据在每个特征维度上的分布稀疏;
特征自相关。
2.PCA算法流程
1) 对所有的样本进行中心化: 样本的每个特征减去该特征均值;
2) 计算样本的协方差矩阵;
3) 对协方差矩阵进行特征值分解;
4) 取出最大的n'个特征值对应的特征向量, 将所有的特征向量标准化后,组成特征向量矩阵;
5) 用特征向量矩阵乘以样本集中的每一个样本x(i),转化为新的样本,即为降维后的输出样本。
ps:实际上sklearn中PCA算法,并不是对协方差矩阵进行特征分解,因为当样本数和样本特征数都较多的时候,计算协方差矩阵的计算量会很大。所以,sklearn中的PCA采用的是SVD(奇异值分解),在不求解协方差矩阵的情况下,得到右奇异矩阵V。也就是说PCA算法可以不用做特征分解,而是做SVD来完成,这个方法在样本量很大的时候很有效。
3. sklearn中PCA参数
class sklearn.decomposition.
PCA
(n_components=None, copy=True, whiten=False, svd_solver='auto', tol=0.0, iterated_power='auto', random_state=None)
n_components:这个参数可以帮我们指定希望PCA降维后的特征维度数目。
-
- 最常用的做法是直接指定降维到的维度数目,此时n_components是一个大于等于1的整数;
- 我们也可以指定主成分的方差和所占的最小比例阈值,让PCA类自己去根据样本特征方差来决定降维到的维度数,此时n_components是一个(0,1]之间的数;
- 我们还可以将参数设置为'mle'(极大似然估计), 此时PCA类会用MLE算法根据特征的方差分布情况自己去选择一定数量的主成分特征来降维;
- 我们也可以用默认值,即不输入n_components,此时n_components=min(样本数,特征数)。
copy: 表示是否在运行算法时,将原始数据复制一份。默认为True,则运行PCA算法后,原始数据的值不会有任何改变。因为是在原始数据的副本上进行运算的。
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实现。当svd_solve设置为'arpack'时,保留的成分必须少于特征数,即不能保留所有成分。
- 默认是'auto',即PCA类会自己去在前面讲到的三种算法里面去权衡,选择一个合适的SVD算法来降维。一般来说,使用默认值就够了。
注意:当设置 n_components == 'mle'时,需要和参数svd_solver一起使用,且svd_solver需要选择 'full' 参数;即pca = PCA(n_components = 'mle',svd_solver='full');同时要保证输入数据的样本数多于特征数才可执行成功。
另外,有两个PCA类的成员值得关注。第一个是explained_variance_,它代表降维后的各主成分的方差值,方差值越大,则说明越是重要的主成分。第二个是explained_variance_ratio_,它代表降维后的各主成分的方差值占总方差值的比例,这个比例越大,则越是重要的主成分。
参考:https://www.cnblogs.com/pinard/p/6239403.html
https://www.cnblogs.com/pinard/p/6243025.html