Python Sklearn PCA函数详解

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 :
    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,这两个方法函数可能会有帮助,

你可能感兴趣的:(Python,机器学习)