zoukankan      html  css  js  c++  java
  • 机器学习sklearn(十五): 特征工程(六)特征选择(一)主成分分析PCA

    1. 准确的PCA和概率解释(Exact PCA and probabilistic interpretation)

    PCA 用于对具有一组连续正交分量(Orthogonal component 译注: 或译为正交成分,下出现 成分 和 分量 是同意词)的多变量数据集进行方差最大化的分解。 在 scikit-learn 中, PCA 被实现为一个变换器对象, 通过 fit 方法可以拟合出 n 个成分, 并且可以将新的数据投影(project, 亦可理解为分解)到这些成分中。

    在应用SVD(奇异值分解) 之前, PCA 是在为每个特征聚集而不是缩放输入数据。可选参数 whiten=True 使得可以将数据投影到奇异(singular)空间上,同时将每个成分缩放到单位方差。 如果下游模型对信号的各向同性作出强假设,这通常是有用的,例如,使用RBF内核的 SVM 算法和 K-Means 聚类算法。

    以下是iris数据集的一个示例,该数据集包含4个特征,通过PCA降维后投影到方差最大的二维空间上:

    PCA 对象还提供了 PCA 算法的概率解释,其可以基于可解释的方差量给出数据的可能性。PCA对象实现了在交叉验证(cross-validation)中使用 score 方法:

     

    示例:

    2. 增量PCA (Incremental PCA)

    PCA 对象非常有用, 但 针对大型数据集的应用, 仍然具有一定的限制。 最大的限制是 PCA 仅支持批处理,这意味着所有要处理的数据必须放在主内存。 IncrementalPCA 对象使用不同的处理形式, 即允许部分计算以小型批处理方式处理数据的方法进行, 而得到和 PCA 算法差不多的结果。 IncrementalPCA 可以通过以下方式实现核外(out-of-core)主成分分析:

    • 基于从本地硬盘或网络数据库中连续获取的数据块之上, 使用 partial_fit 方法。
    • 在 memory mapped file (通过 numpy.memmap 创建)上使用 fit 方法。

    IncrementalPCA 类为了增量式的更新 explainedvariance_ratio ,仅需要存储估计出的分量和噪声方差。 这就是为什么内存使用量依赖于每个批次的样本数量,而不是数据集中需要处理的样本总量。

    在应用SVD之前,IncrementalPCA就像PCA一样,为每个特征聚集而不是缩放输入数据。

     

    示例

    3. 基于随机化SVD的PCA

    通过丢弃具有较低奇异值的奇异向量的分量,将数据降维到低维空间并保留大部分方差信息是非常有意义的。

    例如,如果我们使用64x64像素的灰度级图像进行人脸识别,数据的维数为4096,在这样大的数据上训练含RBF内核的支持向量机是很慢的。此外我们知道这些数据固有维度远低于4096,因为人脸的所有照片都看起来有点相似。样本位于较低维度的流体上(例如约200维)。 PCA算法可以用于线性变换数据,同时降低维数并同时保留大部分可描述的方差信息。

    在这种情况下,使用可选参数 svd_solver='randomized' 的 PCA 是非常有用的。既然我们将要丢弃大部分奇异值,那么仅仅就实际转换中所需的奇异向量进行计算就可以使得 PCA 计算过程变得异常有效。

    例如:以下显示了来自 Olivetti 数据集的 16 个样本肖像(以 0.0 为中心)。右侧是前 16 个奇异向量重画的肖像。因为我们只需要使用大小为 n_{samples} = 400 和 n_{features} = 64 	imes 64 = 4096 的数据集的前 16 个奇异向量, 使得计算时间小于 1 秒。

     

    注意:使用可选参数 svd_solver='randomized' ,在 PCA 中我们还需要给出输入低维空间大小 n_components 。

    我们注意到, 如果 n_{max} = max(n_{mathrm{samples}}, n_{mathrm{features}}) 且 n_{min} = min(n_{mathrm{samples}}, n_{mathrm{features}}), 对于PCA中的实现,随机 PCA 的时间复杂度是:O(n_{max}^2 cdot n_{mathrm{components}}), 而不是 O(n_{max}^2 cdot n_{min}) 。

    就内部实现的方法而言, 随机 PCA 的内存占用量和 2 cdot n_{max} cdot n_{mathrm{components}}, 而不是 n_{max}cdot n_{min} 成正比。

    注意:选择参数 svd_solver='randomized' 的 PCA 的 inverse_transform 的实现, 并不是对应 transform 的逆变换(即使 参数设置为默认的 whiten=False

    示例:

    参考资料:

    4. 核 PCA

    KernelPCA 是 PCA 的扩展,通过使用核方法实现非线性降维(dimensionality reduction) (参阅 成对的矩阵, 类别和核函数)。 它具有许多应用,包括去噪, 压缩和结构化预测( structured prediction ) (kernel dependency estimation(内核依赖估计))。 KernelPCA 支持 transform 和 inverse_transform 。

     

    示例:

    5. 稀疏主成分分析 ( SparsePCA 和 MiniBatchSparsePCA )

    SparsePCA 是 PCA 的一个变体,目的是提取能最大程度得重建数据的稀疏分量集合。

    小批量稀疏 PCA ( MiniBatchSparsePCA ) 是一个 SparsePCA 的变体,它速度更快但准确度有所降低。对于给定的迭代次数,通过迭代该组特征的小块来达到速度的增加。

    Principal component analysis(主成分分析) (PCA) 的缺点在于,通过该方法提取的成分具有独占的密度表达式,即当表示为原始变量的线性组合时,它们具有非零系数,使之难以解释。在许多情况下,真正的基础分量可以被更自然地想象为稀疏向量; 例如在面部识别中,每个分量可能自然地映射到面部的某个部分。

    稀疏的主成分产生更节约、可解释的表达式,明确强调了样本之间的差异性来自哪些原始特征。

    以下示例说明了使用稀疏 PCA 提取 Olivetti 人脸数据集中的 16 个分量。可以看出正则化项产生了许多零。此外,数据的自然结构导致了非零系数垂直相邻 (vertically adjacent)。该模型并不具备纯数学意义的执行: 每个分量都是一个向量 h in mathbf{R}^{4096}, 除非人性化地的可视化为 64x64 像素的图像,否则没有垂直相邻性的概念。下面显示的分量看起来局部化(appear local)是数据的内在结构的影响,这种局部模式使重建误差最小化。有一种考虑到邻接性和不同结构类型的导致稀疏的规范(sparsity-inducing norms),参见 [Jen09] 对这种方法进行了解。有关如何使用稀疏 PCA 的更多详细信息,请参阅下面的示例部分。

     

     请注意,有多种不同的计算稀疏PCA 问题的公式。 这里使用的方法基于 [Mrl09] 。对应优化问题的解决是一个带有惩罚项(L1范数的) ell_1 的 PCA 问题(dictionary learning(字典学习)):

     稀疏推导(sparsity-inducing) ell_1 规范也可以当训练样本很少时,避免从噪声中拟合分量。可以通过超参数 alpha 来调整惩罚程度(或称稀疏度)。值较小会导致温和的正则化因式分解,而较大的值将许多系数缩小到零。

    注意 虽然本着在线算法的精神, MiniBatchSparsePCA 类不实现 partial_fit , 因为在线算法是以特征为导向,而不是以样本为导向。

    示例:

    参考资料:

  • 相关阅读:
    单例模式——C++实现
    单例模式——java实现
    组合模式——java实现
    桥接模式——Java实现
    桥接模式——C++实现
    适配器模式——java实现
    编写一个显示当前时间的jsp页面
    适配器模式——C++实现
    安装配置hadoop1
    Nginx使用教程
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/14903843.html
Copyright © 2011-2022 走看看