Python Sklearn PCA函数详解
网上看了好多博客,抄来抄去的,都是解释一下皮毛,很多参数的含义和用途都没有说。干脆自己研究一下,有写的不对的地方欢迎指出.
官方文档地址 https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCA
函数功能解释
- class sklearn.decomposition.PCA
- 我们通常见到的关于PCA的推导都是使用样本数据求得相关矩阵或者协方差矩阵,然后对这个矩阵进行特征值分解。而且从这种推导方式中,我们可以比较清晰地看出PCA的物理含义。然而从官方文档可以看到,对PCA这个函数的解释多次涉及到SVD分解,这是因为直接求SVD分解比之前的先求协方差矩阵再求特征分解更方便。维基百科上关于使用SVD实现PCA有这么一段解释 https://en.wikipedia.org/wiki/Principal_component_analysis :
- 官方文档提示:该库函数不支持输入稀疏矩阵。稀疏数据可以使用 TruncatedSVD 这个库函数
参数说明
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:int, float, None or str
- 指定PCA降维后的特征维度数目。
- 默认值为min(样本数,特征数)。之所以不能小于样本数是因为前面已经说明输入数据不是稀疏的。
- 如果 n_components设为 ‘mle’ ,svd_solver 设为 ‘full’, 则使用Minka’s MLE方法来估计降维后特征的维度。如果svd_solver设为’auto’,则自动将svd_solver设为’full’。这里使用最大似然估计的方法来得到降维后的维度, 实际上是Probabilistic PCA,简称PPCA,可以参考 https://scikit-learn.org/stable/auto_examples/decomposition/plot_pca_vs_fa_model_selection.html#sphx-glr-auto-examples-decomposition-plot-pca-vs-fa-model-selection-py
- 如果n_components设为大于0小于1的小数且svd_solver设为’full’,则自动根据样本特征方差来决定降维到的维度数,这里n_components表示主成分的方差和所占的最小比例阈值。
- 如果svd_solver = ‘arpack’, n_components 必须严格地小于min(样本数,特征数),此时n_components默认为min(样本数,特征数) - 1。
-
copy:copybool, default=True
- 如果设为False,原输入数据会被新的结果覆盖掉,这个参数不用理会,使用默认的True就可以。
-
whiten: bool, optional (default False)
- 白化会去除变换信号中的一些信息(分量的相对方差尺度),但在数据有比较强的相关性的假设下,有时可以提高下游估计器的性能。
-
svd_solver:str {‘auto’, ‘full’, ‘arpack’, ‘randomized’}
- SVD求解方法。之所以提供这么多方法,一定是在计算时间和精确度上有区别,不过我没有详细研究。
- 如果设为’auto’,则自动选择求解方法。当输入数据大于500*500且提取的主成分小于80%,则使用更有效率的’randomized’方法,否则将使用精确的SVD方法,即’full’。
- 如果设为’full’,则使用scipy.linalg.svd来计算SVD分解。
- 如果设为’arpack’,则使用scipy.sparse.linalg.svds计算SVD分解。这种方法严格要求 0 < n_components < min(样本数,特征数)。
- 如果设为’randomized’,则使用Halko等人提出的随机SVD方法。
-
tol:float >= 0, optional (default .0)
- 当svd_solver = ‘arpack’,用来设置奇异值的容忍度。(我觉得应该类似于收敛门限这一类的参数)
-
iterated_power:int >= 0, or ‘auto’, (default ‘auto’)
- 当svd_solver = ‘randomized’,用来设置计算功率法的迭代次数。
-
random_state:int, RandomState instance or None, optional (default None)
- 但svd_solver = ‘arpack’或者svd_solver = ‘randomized’时,这个参数才起作用。用于产生随机数。
属性说明
-
components_:array, shape (n_components, n_features)
- 特征空间主特征方向的基向量,就是公式推到里的特征向量组成的特征矩阵,这个矩阵的每一行是一个特征向量。按照特征值由大到小的顺序排列。
-
explained_variance_:array, shape (n_components,)
- components_中每一个特征向量对应的方差,就是特征值。
-
explained_variance_ratio_:array, shape (n_components,)
- components_中每一个特征向量对应的特征值占总的特征值之和的比值。
-
singular_values_:array, shape (n_components,)
- 奇异值,注意奇异值和特征值的区别。
-
mean_:array, shape (n_features,)
- 通过训练数据估计的每个特征上的均值。
-
noise_variance_:float
- 在PPCA模型下估计的噪声的协方差。这个属性的含义我也不是太清楚,官方文档有关于这个属性的参考文献来源。
其他属性包括n_components_、n_features_、n_samples_,他们的含义同函数的参数设置。
类方法介绍
- 关于类的方法没有什么好说的,大部分方法都是sklearn的标准格式,值得注意的是socre和score_sample这两个函数。前者返回所有样本的对数似然概率的均值,后者返回每个样本的对数似然概率值。如果研究最大似然PCA或者PPCA,这两个方法函数可能会有帮助,