.. _decompositions: ================================================================= 信号分解为成分(矩阵分解问题) ================================================================= .. currentmodule:: sklearn.decomposition .. _PCA: 主成分分析(PCA) ================================== 精确PCA和概率解释 ------------------------------------------ PCA用于将多元数据集分解为一系列连续的正交成分,这些成分解释了最大量的方差。在scikit-learn中,:class:`PCA` 被实现为一个*转换器*对象,它在 ``fit`` 方法中学习 :math:`n` 个成分,并可用于将新数据投影到这些成分上。 PCA在应用SVD之前对每个特征的输入数据进行中心化处理,但不进行缩放。可选参数 ``whiten=True`` 使得可以将数据投影到奇异空间,同时将每个成分缩放到单位方差。如果下游模型对信号的各向同性做出强假设,这通常很有用:例如,对于具有RBF核的支持向量机和K均值聚类算法就是这种情况。 以下是鸢尾花数据集的示例,该数据集由4个特征组成,投影到解释最多方差的2个维度上: .. figure:: ../auto_examples/decomposition/images/sphx_glr_plot_pca_vs_lda_001.png :target: ../auto_examples/decomposition/plot_pca_vs_lda.html :align: center :scale: 75% :class:`PCA` 对象还提供了PCA的概率解释,可以基于数据解释的方差量给出数据的可能性。因此,它实现了 :term:`score` 方法,该方法可用于交叉验证: .. figure:: ../auto_examples/decomposition/images/sphx_glr_plot_pca_vs_fa_model_selection_001.png :target: ../auto_examples/decomposition/plot_pca_vs_fa_model_selection.html :align: center :scale: 75% .. rubric:: 示例 * :ref:`sphx_glr_auto_examples_decomposition_plot_pca_iris.py` * :ref:`sphx_glr_auto_examples_decomposition_plot_pca_vs_lda.py` * :ref:`sphx_glr_auto_examples_decomposition_plot_pca_vs_fa_model_selection.py` .. _IncrementalPCA: 增量主成分分析(Incremental PCA) --------------------------------- :class:`PCA` 对象非常有用,但对于大型数据集存在一些限制。最大的限制是 :class:`PCA` 仅支持批处理,这意味着所有要处理的数据必须适合主内存。:class:`IncrementalPCA` 对象使用不同的处理形式,并允许进行部分计算,这些计算几乎完全匹配 :class:`PCA` 的结果,同时以小批量方式处理数据。:class:`IncrementalPCA` 使得实现外存主成分分析成为可能,方法包括: * 使用其 ``partial_fit`` 方法在从本地硬盘或网络数据库顺序获取的数据块上进行处理。 * 使用 ``numpy.memmap`` 调用其 fit 方法在内存映射文件上进行处理。 :class:`IncrementalPCA` 仅存储组件和噪声方差的估计值,以便增量更新 ``explained_variance_ratio_`` 。这就是为什么内存使用取决于每个批次中的样本数量,而不是要处理的数据集中的样本总数。 与 :class:`PCA` 一样,:class:`IncrementalPCA` 在应用 SVD 之前对每个特征的输入数据进行中心化处理,但不进行缩放。 .. figure:: ../auto_examples/decomposition/images/sphx_glr_plot_incremental_pca_001.png :target: ../auto_examples/decomposition/plot_incremental_pca.html :align: center :scale: 75% .. figure:: ../auto_examples/decomposition/images/sphx_glr_plot_incremental_pca_002.png :target: ../auto_examples/decomposition/plot_incremental_pca.html :align: center :scale: 75% .. rubric:: 示例 * :ref:`sphx_glr_auto_examples_decomposition_plot_incremental_pca.py` .. _RandomizedPCA: 使用随机 SVD 的主成分分析(PCA using randomized SVD) ----------------------------------------------------- 将数据投影到一个保留大部分方差的低维空间通常很有趣,通过丢弃与较低奇异值相关联的奇异向量来实现。 例如,如果我们使用64x64像素的灰度级图片进行人脸识别,数据的维度为4096,在这样的宽数据上训练RBF支持向量机速度很慢。此外,我们知道数据的内在维度远低于4096,因为所有人脸图片看起来都有些相似。样本位于一个低得多的流形上(例如大约200维)。PCA算法可以用于线性变换数据,同时降低维度并保留大部分解释方差。 在这种情况下,使用可选参数 ``svd_solver='randomized'`` 的类:class:`PCA` 非常有用:因为我们将会丢弃大部分奇异向量,所以将计算限制在我们将保留的奇异向量的近似估计上,以实际执行变换,效率更高。 例如,以下显示了Olivetti数据集中的16个样本肖像(围绕0.0中心化)。在右侧是前16个奇异向量重塑为肖像。因为我们只需要大小为:math:`n_{samples} = 400` 和:math:`n_{features} = 64 \times 64 = 4096` 的数据集的前16个奇异向量,计算时间不到1秒: .. |orig_img| image:: ../auto_examples/decomposition/images/sphx_glr_plot_faces_decomposition_001.png :target: ../auto_examples/decomposition/plot_faces_decomposition.html :scale: 60% .. |pca_img| image:: ../auto_examples/decomposition/images/sphx_glr_plot_faces_decomposition_002.png :target: ../auto_examples/decomposition/plot_faces_decomposition.html :scale: 60% .. centered:: |orig_img| |pca_img| 如果我们记:math:`n_{\max} = \max(n_{\mathrm{samples}}, n_{\mathrm{features}})` , :math:`n_{\min} = \min(n_{\mathrm{samples}}, n_{\mathrm{features}})` ,随机化 :class:`PCA` 的时间复杂度是 :math:`O(n_{\max}^2 \cdot n_{\mathrm{components}})` ,而不是精确方法在 :class:`PCA` 中实现的 :math:`O(n_{\max}^2 \cdot n_{\min})` 。 随机化 :class:`PCA` 的内存占用也与 :math:`2 \cdot n_{\max} \cdot n_{\mathrm{components}}` 成正比,而不是精确方法的 :math:`n_{\max} \cdot n_{\min}` 。 注意:在 :class:`PCA` 中使用 ``svd_solver='randomized'`` 实现的 ``inverse_transform`` 即使在 ``whiten=False`` (默认)时也不是 ``transform`` 的精确逆变换。 .. rubric:: 示例 * :ref:`sphx_glr_auto_examples_applications_plot_face_recognition.py` * :ref:`sphx_glr_auto_examples_decomposition_plot_faces_decomposition.py` .. rubric:: 参考文献 * 算法 4.3 在 :arxiv:`"Finding structure with randomness: Stochastic algorithms for constructing approximate matrix decompositions" <0909.4061>` Halko, et al., 2009 * :arxiv:`"An implementation of a randomized algorithm for principal component analysis" <1412.3510>` A. Szlam et al. 2014 .. _SparsePCA: 稀疏主成分分析(SparsePCA 和 MiniBatchSparsePCA) ----------------------------------------------------------------------- :class:`SparsePCA` 是 PCA 的一种变体,旨在提取最能重构数据的一组稀疏成分。 小批量稀疏 PCA(:class:`MiniBatchSparsePCA` )是 :class:`SparsePCA` 的一种变体,速度更快但准确性较低。通过在给定数量的迭代中遍历特征的小块来实现速度的提升。 主成分分析(:class:`PCA` )的一个缺点是,这种方法提取的成分具有完全密集的表达,即当它们被表示为原始变量的线性组合时,具有非零系数。这可能使得解释变得困难。在许多情况下, 实际的底层组件可以更自然地想象为稀疏向量;例如在人脸识别中,组件可能自然地映射到人脸的各个部分。 稀疏主成分分析产生了一种更简洁、可解释的表示,清楚地强调了哪些原始特征对样本之间的差异有贡献。 下面的例子展示了从Olivetti人脸数据集中使用稀疏主成分分析提取的16个组件。可以看出,正则化项导致了大量的零值。此外,数据的自然结构使得非零系数在垂直方向上相邻。模型在数学上并不强制这一点:每个组件是一个向量 :math:`h \in \mathbf{R}^{4096}` ,除了在人类友好的64x64像素图像可视化中,没有垂直相邻的概念。下面显示的组件看起来局部化是数据固有结构的效果,这种局部模式最小化了重建误差。存在考虑相邻性和不同类型结构的稀疏诱导范数;参见[Jen09]_以回顾此类方法。 有关如何使用稀疏主成分分析的更多详细信息,请参见下面的示例部分。 .. |spca_img| image:: ../auto_examples/decomposition/images/sphx_glr_plot_faces_decomposition_005.png :target: ../auto_examples/decomposition/plot_faces_decomposition.html :scale: 60% .. centered:: |pca_img| |spca_img| 请注意,稀疏主成分分析问题有许多不同的表述。这里实现的基于[Mrl09]_。解决的优化问题是带有 :math:`\ell_1` 惩罚项的主成分分析(字典学习)问题: .. math:: (U^*, V^*) = \underset{U, V}{\operatorname{arg\,min\,}} & \frac{1}{2} ||X-UV||_{\text{Fro}}^2+\alpha||V||_{1,1} \\ \text{subject to } & ||U_k||_2 <= 1 \text{ for all } 0 \leq k < n_{components} :math:`||.||_{\text{Fro}}` 表示 Frobenius 范数,而 :math:`||.||_{1,1}` 表示逐元素矩阵范数,即矩阵中所有元素绝对值之和。 引入稀疏性的 :math:`||.||_{1,1}` 矩阵范数还能在训练样本较少时防止学习到噪声成分。惩罚的程度(以及稀疏性)可以通过超参数 ``alpha`` 进行调整。较小的值会导致温和的正则化因子分解,而较大的值则会使许多系数收缩至零。 .. note:: 尽管在在线算法的理念下,类 :class:`MiniBatchSparsePCA` 并未实现 ``partial_fit`` 方法,因为该算法是沿着特征方向在线的,而非样本方向。 .. rubric:: 示例 * :ref:`sphx_glr_auto_examples_decomposition_plot_faces_decomposition.py` .. rubric:: 参考文献 .. [Mrl09] `"Online Dictionary Learning for Sparse Coding" `_ J. Mairal, F. Bach, J. Ponce, G. Sapiro, 2009 .. [Jen09] `"Structured Sparse Principal Component Analysis" `_ R. Jenatton, G. Obozinski, F. Bach, 2009 .. _kernel_PCA: 核主成分分析 (kPCA) ================== 精确核主成分分析 ---------------- :class:`KernelPCA` 是 PCA 的扩展,通过使用核函数(参见 :ref:`metrics` )[Scholkopf1997]_ 实现非线性降维。它在许多应用中都有用,包括去噪、压缩和结构化预测(核依赖估计)。:class:`KernelPCA` 支持 ``transform`` 和 ``inverse_transform`` 。 .. figure:: ../auto_examples/decomposition/images/sphx_glr_plot_kernel_pca_002.png :target: ../auto_examples/decomposition/plot_kernel_pca.html :align: center :scale: 75% .. note:: :meth:`KernelPCA.inverse_transform` 依赖于一个核岭回归来学习逆变换。 将样本从PCA基映射回原始特征空间 [Bakir2003]_。因此,通过 :meth:`KernelPCA.inverse_transform` 获得的重建是一个近似值。有关更多详细信息,请参见下面的示例链接。 .. rubric:: 示例 * :ref:`sphx_glr_auto_examples_decomposition_plot_kernel_pca.py` * :ref:`sphx_glr_auto_examples_applications_plot_digits_denoising.py` .. rubric:: 参考文献 .. [Scholkopf1997] Schölkopf, Bernhard, Alexander Smola, and Klaus-Robert Müller. `"Kernel principal component analysis." `_ 国际人工神经网络会议。 Springer, Berlin, Heidelberg, 1997. .. [Bakir2003] Bakır, Gökhan H., Jason Weston, and Bernhard Schölkopf. `"Learning to find pre-images." `_ 神经信息处理系统进展 16 (2003): 449-456. .. _kPCA_Solvers: Kernel PCA 的求解器选择 ----------------------- 在 :class:`PCA` 中,组件的数量受特征数量的限制,而在 :class:`KernelPCA` 中,组件的数量受样本数量的限制。许多现实世界的数据集具有大量的样本!在这些情况下,使用完整的 kPCA 找到 *所有* 组件是计算时间的浪费,因为数据主要由前几个组件描述(例如 ``n_components<=100`` )。换句话说,在 Kernel PCA 拟合过程中进行特征分解的中心 Gram 矩阵的有效秩远小于其大小。在这种情况下,近似特征求解器可以在非常低的精度损失下提供加速。 .. dropdown:: 特征求解器 可选参数 ``eigen_solver='randomized'`` 可以用于 *显著* 减少计算时间,当请求的组件数量较多时。 ``n_components`` 相对于样本数量较小。它依赖于随机分解方法,在较短时间内找到一个近似解。 随机化 :class:`KernelPCA` 的时间复杂度是 :math:`O(n_{\mathrm{samples}}^2 \cdot n_{\mathrm{components}})` 而不是精确方法(使用 ``eigen_solver='dense'`` 实现)的 :math:`O(n_{\mathrm{samples}}^3)` 。 随机化 :class:`KernelPCA` 的内存占用也与 :math:`2 \cdot n_{\mathrm{samples}} \cdot n_{\mathrm{components}}` 成正比, 而不是精确方法的 :math:`n_{\mathrm{samples}}^2` 。 注意:此技术与 :ref:`RandomizedPCA` 相同。 除了上述两种求解器外,还可以使用 ``eigen_solver='arpack'`` 作为获取近似分解的替代方法。实际上,这种方法仅在要找到的组件数量极少时提供合理的执行时间。当所需组件数量小于 10(严格)且样本数量大于 200(严格)时,默认启用此方法。详情请参见 :class:`KernelPCA` 。 .. rubric:: 参考文献 * *dense* 求解器: `scipy.linalg.eigh 文档 `_ * *randomized* 求解器: * 算法 4.3 在 :arxiv:`"Finding structure with randomness: Stochastic algorithms for constructing approximate matrix decompositions" <0909.4061>` Halko, et al. (2009) * :arxiv:`"An implementation of a randomized algorithm for principal component analysis" <1412.3510>` A. Szlam et al. (2014) * *arpack* 求解器: `scipy.sparse.linalg.eigsh 文档 `_ R. B. Lehoucq, D. C. Sorensen, and C. Yang, (1998) .. _LSA: 截断奇异值分解与潜在语义分析 ================================ :class:`TruncatedSVD` 实现了一种奇异值分解(SVD)的变体,它只计算最大的 :math:`k` 个奇异值,其中 :math:`k` 是用户指定的参数。 :class:`TruncatedSVD` 与 :class:`PCA` 非常相似,但不同之处在于矩阵 :math:`X` 不需要被中心化。当从特征值中减去 :math:`X` 的列(每个特征)均值时,对结果矩阵进行截断 SVD 等价于 PCA。 .. dropdown:: 关于截断 SVD 和潜在语义分析(LSA) 当截断 SVD 应用于术语-文档矩阵(如由 :class:`~sklearn.feature_extraction.text.CountVectorizer` 或 :class:`~sklearn.feature_extraction.text.TfidfVectorizer` 返回的)时,这种变换被称为 `潜在语义分析 `_ (LSA),因为它将这些矩阵转换为低维度的“语义”空间。特别是,LSA 被认为可以对抗同义词和多义词(两者大致意味着每个单词有多个含义)的影响,这些影响导致术语-文档矩阵过于稀疏,并且在诸如余弦相似性等度量下表现出较差的相似性。 .. note:: LSA 也被称为潜在语义索引,LSI,尽管严格来说,这是指其在信息检索目的的持久索引中的应用。 从数学上讲,截断 SVD 应用于训练样本 :math:`X` 会产生一个低秩近似 :math:`X` : .. math:: X \approx X_k = U_k \Sigma_k V_k^\top 在此操作之后,:math:`U_k \Sigma_k` 是具有 :math:`k` 个特征(在 API 中称为 ``n_components`` )的变换训练集。 为了也变换一个测试集 :math:`X` ,我们将其与 :math:`V_k` 相乘: .. math:: X' = X V_k .. note:: 自然语言处理(NLP)和信息检索(IR)文献中大多数关于LSA的处理 都会交换矩阵 :math:`X` 的轴,使其具有形状 ``(n_features, n_samples)`` 。 我们以一种不同的方式呈现LSA,更好地匹配scikit-learn API, 但找到的奇异值是相同的。 尽管 :class:`TruncatedSVD` 转换器 可以处理任何特征矩阵, 但在LSA/文档处理设置中,建议使用它处理tf-idf矩阵而非原始频率计数。 特别是,应开启子线性缩放和逆文档频率( ``sublinear_tf=True, use_idf=True`` ) 以使特征值更接近高斯分布, 补偿LSA对文本数据的错误假设。 .. rubric:: 示例 * :ref:`sphx_glr_auto_examples_text_plot_document_clustering.py` .. rubric:: 参考文献 * Christopher D. Manning, Prabhakar Raghavan and Hinrich Schütze (2008), *Introduction to Information Retrieval*, Cambridge University Press, 第18章: `矩阵分解与潜在语义索引 `_ * 正交匹配追踪(:ref:`omp` ) * 最小角回归(:ref:`least_angle_regression` ) * 通过最小角回归计算的Lasso * 使用坐标下降法的Lasso(:ref:`lasso` ) * 阈值化 阈值化非常快速,但它不会产生精确的重建结果。在文献中,它们已被证明在分类任务中很有用。对于图像重建任务,正交匹配追踪产生了最准确、无偏的重建结果。 字典学习对象通过 ``split_code`` 参数提供了将稀疏编码结果中的正负值分开的可能性。这在字典学习用于提取将用于监督学习的特征时很有用,因为它允许学习算法为特定原子的负载分配不同的权重,与相应的正载不同。 单个样本的分割编码长度为 ``2 * n_components`` ,并按照以下规则构建:首先,计算长度为 ``n_components`` 的常规编码。然后, ``split_code`` 的前 ``n_components`` 个条目填充常规编码向量的正部分。分割编码的后半部分填充编码向量的负部分,仅带有正号。因此,分割编码是非负的。 .. 标题:: 示例 * :ref:`sphx_glr_auto_examples_decomposition_plot_sparse_coding.py` 通用字典学习 -------------- 字典学习(:class:`DictionaryLearning` )是一个矩阵分解问题,其目的是找到一个(通常是过完备的)字典,以便在稀疏编码拟合数据时表现良好。 将数据表示为来自过完备字典的原子的稀疏组合,这被认为是哺乳动物初级视觉皮层的工作方式。因此,应用于图像块的字典学习已被证明可以 在图像处理任务中,如图像补全、修复和去噪,以及监督识别任务中,都能取得良好的效果。 字典学习是一个通过交替更新稀疏编码来解决的优化问题,稀疏编码作为多个Lasso问题的解,考虑字典固定,然后更新字典以最好地适应稀疏编码。 .. math:: (U^*, V^*) = \underset{U, V}{\operatorname{arg\,min\,}} & \frac{1}{2} ||X-UV||_{\text{Fro}}^2+\alpha||U||_{1,1} \\ \text{subject to } & ||V_k||_2 <= 1 \text{ for all } 0 \leq k < n_{\mathrm{atoms}} .. |pca_img2| image:: ../auto_examples/decomposition/images/sphx_glr_plot_faces_decomposition_002.png :target: ../auto_examples/decomposition/plot_faces_decomposition.html :scale: 60% .. |dict_img2| image:: ../auto_examples/decomposition/images/sphx_glr_plot_faces_decomposition_007.png :target: ../auto_examples/decomposition/plot_faces_decomposition.html :scale: 60% .. centered:: |pca_img2| |dict_img2| :math:`||.||_{\text{Fro}}` 表示Frobenius范数,而 :math:`||.||_{1,1}` 表示逐元素矩阵范数,即矩阵中所有元素绝对值之和。 使用这样的过程拟合字典后,变换仅是一个稀疏编码步骤,与所有字典学习对象共享相同的实现(参见 :ref:`SparseCoder` )。 也可以约束字典和/或编码为正,以匹配数据中可能存在的约束。以下是应用不同正性约束的人脸图像。红色表示负值,蓝色表示正值,白色表示零。 .. |dict_img_pos1| image:: ../auto_examples/decomposition/images/sphx_glr_plot_faces_decomposition_010.png :target: ../auto_examples/decomposition/plot_image_denoising.html :scale: 60% .. |dict_img_pos2| image:: ../auto_examples/decomposition/images/sphx_glr_plot_faces_decomposition_011.png :target: ../auto_examples/decomposition/plot_image_denoising.html :scale: 60% .. |dict_img_pos3| image:: ../auto_examples/decomposition/images/sphx_glr_plot_faces_decomposition_012.png :target: ../auto_examples/decomposition/plot_image_denoising.html :scale: 60% .. |dict_img_pos4| image:: ../auto_examples/decomposition/images/sphx_glr_plot_faces_decomposition_013.png :target: ../auto_examples/decomposition/plot_image_denoising.html :scale: 60% .. centered:: |dict_img_pos1| |dict_img_pos2| .. centered:: |dict_img_pos3| |dict_img_pos4| 以下图像展示了从浣熊面部图像的一部分提取的4x4像素图像块学习到的字典的外观。 .. figure:: ../auto_examples/decomposition/images/sphx_glr_plot_image_denoising_001.png :target: ../auto_examples/decomposition/plot_image_denoising.html :align: center :scale: 50% .. rubric:: 示例 * :ref:`sphx_glr_auto_examples_decomposition_plot_image_denoising.py` .. rubric:: 参考文献 * `"Online dictionary learning for sparse coding" `_ J. Mairal, F. Bach, J. Ponce, G. Sapiro, 2009 .. _MiniBatchDictionaryLearning: 小批量字典学习 ---------------- :class:`MiniBatchDictionaryLearning` 实现了字典学习算法的更快但准确度较低的版本,更适合大型数据集。 默认情况下,:class:`MiniBatchDictionaryLearning` 将数据分成小批量,并通过在指定次数的迭代中循环遍历小批量以在线方式进行优化。然而,目前它没有实现停止条件。 该估计器还实现了 ``partial_fit`` ,它通过仅遍历一次小批量来更新字典。这可以用于在线学习。 当数据从一开始就不容易获得,或者数据不适合放入内存时。 .. currentmodule:: sklearn.cluster .. image:: ../auto_examples/cluster/images/sphx_glr_plot_dict_face_patches_001.png :target: ../auto_examples/cluster/plot_dict_face_patches.html :scale: 50% :align: right .. topic:: **用于字典学习的聚类** 请注意,当使用字典学习来提取表示(例如,用于稀疏编码)时,聚类可以是一个很好的代理来学习字典。例如,:class:`MiniBatchKMeans` 估计器在计算上是高效的,并实现了带有 ``partial_fit`` 方法的在线学习。 示例: :ref:`sphx_glr_auto_examples_cluster_plot_dict_face_patches.py` .. currentmodule:: sklearn.decomposition .. _FA: 因子分析 ======== 在无监督学习中,我们只有一个数据集 :math:`X = \{x_1, x_2, \dots, x_n\}` 。如何从数学上描述这个数据集?一个非常简单的 `连续潜在变量` 模型为 :math:`X` 是 .. math:: x_i = W h_i + \mu + \epsilon 向量 :math:`h_i` 被称为“潜在”的,因为它未被观察到。:math:`\epsilon` 被认为是一个噪声项,根据均值为0且协方差为 :math:`\Psi` 的高斯分布(即 :math:`\epsilon \sim \mathcal{N}(0, \Psi)` ),:math:`\mu` 是一些任意的偏移向量。这样的模型被称为“生成”模型,因为它描述了 :math:`x_i` 是如何从 :math:`h_i` 生成的。如果我们使用所有的 :math:`x_i` 作为列来形成矩阵 :math:`\mathbf{X}` ,并且所有的 :math:`h_i` 作为列来形成矩阵 :math:`\mathbf{H}` ,那么我们可以写成(带有适当定义的 :math:`\mathbf{M}` 和 :math:`\mathbf{E}` ): .. math:: \mathbf{X} = W \mathbf{H} + \mathbf{M} + \mathbf{E} 换句话说,我们 *分解* 了矩阵 :math:`\mathbf{X}` 。 如果 :math:`h_i` 是给定的,上述方程自动意味着以下概率解释: .. math:: p(x_i|h_i) = \mathcal{N}(Wh_i + \mu, \Psi) 为了构建一个完整的概率模型,我们还需要对潜在变量 :math:`h` 设定一个先验分布。最直接的假设(基于高斯分布的良好性质)是 :math:`h \sim \mathcal{N}(0, \mathbf{I})` 。这导致 :math:`x` 的边缘分布为高斯分布: .. math:: p(x) = \mathcal{N}(\mu, WW^T + \Psi) 现在,如果不做进一步假设,引入潜在变量 :math:`h` 的想法将是多余的—— :math:`x` 可以完全用均值和协方差来建模。我们需要对这两个参数之一施加一些更具体的结构。一个简单的额外假设是关于误差协方差 :math:`\Psi` 的结构: * :math:`\Psi = \sigma^2 \mathbf{I}` :这个假设导致了 :class:`PCA` 的概率模型。 * :math:`\Psi = \mathrm{diag}(\psi_1, \psi_2, \dots, \psi_n)` :这个模型被称为 :class:`FactorAnalysis` ,是一个经典的统计模型。矩阵 W 有时被称为“因子载荷矩阵”。 这两个模型本质上都是估计一个具有低秩协方差矩阵的高斯分布。因为这两个模型都是概率性的,它们可以被整合到更复杂的模型中,例如因子分析的混合模型。如果假设潜在变量的非高斯先验,会得到非常不同的模型(例如 :class:`FastICA` )。 因子分析 *可以* 产生与 :class:`PCA` 相似的成分(其载荷矩阵的列)。然而,不能对这些成分做出任何一般性陈述(例如它们是否正交): .. |pca_img3| image:: ../auto_examples/decomposition/images/sphx_glr_plot_faces_decomposition_002.png :target: ../auto_examples/decomposition/plot_faces_decomposition.html :scale: 60% .. |fa_img3| image:: ../auto_examples/decomposition/images/sphx_glr_plot_faces_decomposition_008.png :target: ../auto_examples/decomposition/plot_faces_decomposition.html :scale: 60% .. centered:: |pca_img3| |fa_img3| 因子分析相对于 :class:`PCA` 的主要优势在于,它能够独立地对输入空间每个方向的方差进行建模(异方差噪声): .. figure:: ../auto_examples/decomposition/images/sphx_glr_plot_faces_decomposition_009.png :target: ../auto_examples/decomposition/plot_faces_decomposition.html :align: center :scale: 75% 这使得在存在异方差噪声的情况下,因子分析比概率PCA能更好地进行模型选择: .. figure:: ../auto_examples/decomposition/images/sphx_glr_plot_pca_vs_fa_model_selection_002.png :target: ../auto_examples/decomposition/plot_pca_vs_fa_model_selection.html :align: center :scale: 75% 因子分析通常会跟随一个因子的旋转(使用参数 `rotation` ),通常是为了提高可解释性。例如,Varimax旋转最大化平方载荷的方差之和,即它倾向于产生更稀疏的因子,每个因子仅受少数几个特征的影响(即“简单结构”)。参见下面的第一个示例。 .. rubric:: 示例 * :ref:`sphx_glr_auto_examples_decomposition_plot_varimax_fa.py` * :ref:`sphx_glr_auto_examples_decomposition_plot_pca_vs_fa_model_selection.py` .. _ICA: 独立成分分析(ICA) ==================== 独立成分分析将多元信号分离成最大程度独立的加性子成分。在scikit-learn中,它使用 :class:`Fast ICA ` 算法实现。通常,ICA不用于降维,而是用于分离叠加信号。由于ICA模型不包含噪声项,为了使模型正确,必须进行白化处理。这可以通过使用whiten参数内部完成,或者手动使用PCA的变体之一来完成。 它经典地用于分离混合信号(一个被称为*盲源分离*的问题),如下面的示例所示: .. figure:: ../auto_examples/decomposition/images/sphx_glr_plot_ica_blind_source_separation_001.png :target: ../auto_examples/decomposition/plot_ica_blind_source_separation.html :align: center :scale: 60% ICA 也可以作为另一种非线性分解方法,用于寻找具有一定稀疏性的成分: .. |pca_img4| image:: ../auto_examples/decomposition/images/sphx_glr_plot_faces_decomposition_002.png :target: ../auto_examples/decomposition/plot_faces_decomposition.html :scale: 60% .. |ica_img4| image:: ../auto_examples/decomposition/images/sphx_glr_plot_faces_decomposition_004.png :target: ../auto_examples/decomposition/plot_faces_decomposition.html :scale: 60% .. centered:: |pca_img4| |ica_img4| .. rubric:: 示例 * :ref:`sphx_glr_auto_examples_decomposition_plot_ica_blind_source_separation.py` * :ref:`sphx_glr_auto_examples_decomposition_plot_ica_vs_pca.py` * :ref:`sphx_glr_auto_examples_decomposition_plot_faces_decomposition.py` .. _NMF: 非负矩阵分解(NMF 或 NNMF) =============================================== 使用 Frobenius 范数的 NMF --------------------------- :class:`NMF` [1]_ 是一种替代分解方法,假设数据和成分均为非负。在数据矩阵不包含负值的情况下,:class:`NMF` 可以替代 :class:`PCA` 或其变体。它通过优化样本 :math:`X` 与矩阵乘积 :math:`WH` 之间的距离 :math:`d` ,找到两个非负元素的矩阵 :math:`W` 和 :math:`H` 的分解。最广泛使用的距离函数是平方 Frobenius 范数,这是矩阵的欧几里得范数的明显扩展: .. math:: d_{\mathrm{Fro}}(X, Y) = \frac{1}{2} ||X - Y||_{\mathrm{Fro}}^2 = \frac{1}{2} \sum_{i,j} (X_{ij} - {Y}_{ij})^2 与 :class:`PCA` 不同,向量的表示是通过加法方式获得的。 通过叠加组件而不减去任何部分,这种加法模型在表示图像和文本时非常高效。 在[Hoyer, 2004] [2]_中观察到,当经过仔细约束时,:class:`NMF` 能够生成基于部分的 数据集表示,从而产生可解释的模型。以下示例展示了从Olivetti人脸数据集中由 :class:`NMF` 找到的16个稀疏组件,并与PCA特征脸进行比较。 .. |pca_img5| image:: ../auto_examples/decomposition/images/sphx_glr_plot_faces_decomposition_002.png :target: ../auto_examples/decomposition/plot_faces_decomposition.html :scale: 60% .. |nmf_img5| image:: ../auto_examples/decomposition/images/sphx_glr_plot_faces_decomposition_003.png :target: ../auto_examples/decomposition/plot_faces_decomposition.html :scale: 60% .. centered:: |pca_img5| |nmf_img5| `init` 属性决定了所应用的初始化方法,这对方法的性能有很大影响。:class:`NMF` 实现了 非负双重奇异值分解方法。NNDSVD [4]_基于两个SVD过程,一个近似数据矩阵,另一个利用 单位秩矩阵的代数性质来近似结果部分SVD因子的正部分。基本的NNDSVD算法更适合稀疏 分解。其变体NNDSVDa(其中所有零被设置为数据所有元素的平均值)和NNDSVDar(其中 零被设置为小于数据平均值除以100的随机扰动)在密集情况下被推荐使用。 请注意,乘法更新('mu')求解器不能更新初始化中存在的零,因此当与引入大量零的 基本NNDSVD算法联合使用时,会导致较差的结果;在这种情况下,应优先选择NNDSVDa或 NNDSVDar。 :class:`NMF` 也可以用正确缩放的随机非负值进行初始化。 通过设置 `init="random"` 来初始化矩阵。还可以传递一个整数种子或一个 ``RandomState`` 给 `random_state` 以控制可重复性。 在 :class:`NMF` 中,可以向损失函数添加 L1 和 L2 先验以正则化模型。L2 先验使用 Frobenius 范数,而 L1 先验使用逐元素的 L1 范数。与 :class:`~sklearn.linear_model.ElasticNet` 类似,我们使用 `l1_ratio` (:math:`\rho` ) 参数控制 L1 和 L2 的组合,并使用 `alpha_W` 和 `alpha_H` (:math:`\alpha_W` 和 :math:`\alpha_H` ) 参数控制正则化的强度。先验项根据样本数量 (:math:`n\_samples` ) 对 `H` 和特征数量 (:math:`n\_features` ) 对 `W` 进行缩放,以保持它们相对于彼此和数据拟合项的平衡,并尽可能独立于训练集的大小。然后,先验项为: .. math:: (\alpha_W \rho ||W||_1 + \frac{\alpha_W(1-\rho)}{2} ||W||_{\mathrm{Fro}} ^ 2) * n\_features + (\alpha_H \rho ||H||_1 + \frac{\alpha_H(1-\rho)}{2} ||H||_{\mathrm{Fro}} ^ 2) * n\_samples 正则化目标函数为: .. math:: d_{\mathrm{Fro}}(X, WH) + (\alpha_W \rho ||W||_1 + \frac{\alpha_W(1-\rho)}{2} ||W||_{\mathrm{Fro}} ^ 2) * n\_features + (\alpha_H \rho ||H||_1 + \frac{\alpha_H(1-\rho)}{2} ||H||_{\mathrm{Fro}} ^ 2) * n\_samples 使用 beta-divergence 的 NMF -------------------------- 如前所述,最广泛使用的距离函数是平方 Frobenius 范数,这是欧几里得范数对矩阵的明显扩展: .. math:: d_{\mathrm{Fro}}(X, Y) = \frac{1}{2} ||X - Y||_{Fro}^2 = \frac{1}{2} \sum_{i,j} (X_{ij} - {Y}_{ij})^2 在 NMF 中可以使用其他距离函数,例如(广义)Kullback-Leibler (KL) 散度,也称为 I-散度: .. math:: d_{KL}(X, Y) = \sum_{i,j} (X_{ij} \log(\frac{X_{ij}}{Y_{ij}}) - X_{ij} + Y_{ij}) 或者,Itakura-Saito (IS) 散度: .. math:: d_{IS}(X, Y) = \sum_{i,j} (\frac{X_{ij}}{Y_{ij}} - \log(\frac{X_{ij}}{Y_{ij}}) - 1) 这三种距离是beta-divergence家族的特殊情况,分别对应于:math:`\beta = 2, 1, 0` [6]。beta-divergence定义如下: .. math:: d_{\beta}(X, Y) = \sum_{i,j} \frac{1}{\beta(\beta - 1)}(X_{ij}^\beta + (\beta-1)Y_{ij}^\beta - \beta X_{ij} Y_{ij}^{\beta - 1}) .. image:: ../images/beta_divergence.png :align: center :scale: 75% 需要注意的是,如果:math:`\beta \in (0; 1)` ,这个定义是无效的,但它可以连续地扩展到:math:`d_{KL}` 和:math:`d_{IS}` 的定义。 .. dropdown:: NMF实现的求解器 :class:`NMF` 实现了两个求解器,使用坐标下降法('cd') [5]_和乘法更新法('mu') [6]_。'mu'求解器可以优化每一个beta-divergence,当然包括Frobenius范数(:math:`\beta=2` )、(广义)Kullback-Leibler散度(:math:`\beta=1` )和Itakura-Saito散度(:math:`\beta=0` )。注意,对于:math:`\beta \in (1; 2)` ,'mu'求解器比其他:math:`\beta` 值要快得多。还要注意,对于负的(或0,即'itakura-saito') :math:`\beta` ,输入矩阵不能包含零值。 'cd'求解器只能优化Frobenius范数。由于NMF的底层非凸性,不同的求解器可能会收敛到不同的最小值,即使是在优化相同的距离函数时。 NMF最好与 ``fit_transform`` 方法一起使用,该方法返回矩阵W。矩阵H存储在拟合模型的 ``components_`` 属性中;方法 ``transform`` 将基于这些存储的组件分解一个新的矩阵X_new:: >>> import numpy as np >>> X = np.array([[1, 1], [2, 1], [3, 1.2], [4, 1], [5, 0.8], [6, 1]]) >>> from sklearn.decomposition import NMF >>> model = NMF(n_components=2, init='random', random_state=0) >>> W = model.fit_transform(X) >>> H = model.components_ >>> X_new = np.array([[1, 0], [1, 6.1], [1, 0], [1, 4], [3.2, 1], [0, 4]]) >>> W_new = model.transform(X_new) .. rubric:: 示例 * :ref:`sphx_glr_auto_examples_decomposition_plot_faces_decomposition.py` * :ref:`sphx_glr_auto_examples_applications_plot_topics_extraction_with_nmf_lda.py` .. _MiniBatchNMF: 小批量非负矩阵分解 -------------------- :class:`MiniBatchNMF` [7]_ 实现了一种更快但不太准确的非负矩阵分解版本(即 :class:`~sklearn.decomposition.NMF`),更适合大型数据集。 默认情况下,:class:`MiniBatchNMF` 将数据分成小批量,并通过循环遍历指定迭代次数的小批量以在线方式优化 NMF 模型。``batch_size`` 参数控制批量的大小。 为了加速小批量算法,还可以缩放过去的小批量,使它们的重要性低于新的小批量。这是通过引入一个所谓的遗忘因子来实现的,该因子由 ``forget_factor`` 参数控制。 该估计器还实现了 ``partial_fit``,它通过仅遍历一次小批量来更新 ``H``。这可以用于在线学习,当数据一开始不可用时,或者当数据不适合内存时。 .. rubric:: 参考文献 .. [1] `"Learning the parts of objects by non-negative matrix factorization" `_ D. Lee, S. Seung, 1999 .. [2] `"Non-negative Matrix Factorization with Sparseness Constraints" `_ P. Hoyer, 2004 .. [4] `"SVD based initialization: A head start for nonnegative matrix factorization" `_ C. Boutsidis, E. Gallopoulos, 2008 .. [5] `"Fast local algorithms for large scale nonnegative matrix and tensor factorizations." `_ A. Cichocki, A. Phan, 2009 .. [6] :arxiv:`"基于beta散度的非负矩阵分解算法" <1010.1763>` C. Fevotte, J. Idier, 2011 .. [7] :arxiv:`"基于Itakura-Saito散度的在线非负矩阵分解算法" <1106.4198>` A. Lefevre, F. Bach, C. Fevotte, 2011 .. _LatentDirichletAllocation: 潜在狄利克雷分配(LDA) ======================== 潜在狄利克雷分配是一种用于离散数据集(如文本语料库)的生成概率模型。它也是一种主题模型,用于从文档集合中发现抽象主题。 LDA的图形模型是一个三层次的生成模型: .. image:: ../images/lda_model_graph.png :align: center 关于上述图形模型中使用的符号,可以在Hoffman等人(2013)中找到: * 语料库是包含 :math:`D` 个文档的集合。 * 一个文档是包含 :math:`N` 个词的序列。 * 语料库中有 :math:`K` 个主题。 * 方框表示重复采样。 在图形模型中,每个节点都是一个随机变量,并在生成过程中扮演角色。阴影节点表示观察到的变量,未阴影节点表示隐藏(潜在)变量。在这种情况下,语料库中的词是我们唯一观察到的数据。潜在变量决定了语料库中主题的随机混合以及文档中词的分布。LDA的目标是利用观察到的词来推断隐藏的主题结构。 .. dropdown:: 关于建模文本语料库的详细信息 在建模文本语料库时,模型假设以下生成过程 对于一个包含 :math:`D` 个文档和 :math:`K` 个主题的语料库,其中 :math:`K` 对应于 API 中的 `n_components` : 1. 对于每个主题 :math:`k \in K` ,抽取 :math:`\beta_k \sim \mathrm{Dirichlet}(\eta)` 。这提供了词的分布,即词在主题 :math:`k` 中出现的概率。:math:`\eta` 对应于 `topic_word_prior` 。 2. 对于每个文档 :math:`d \in D` ,抽取主题比例 :math:`\theta_d \sim \mathrm{Dirichlet}(\alpha)` 。:math:`\alpha` 对应于 `doc_topic_prior` 。 3. 对于文档 :math:`d` 中的每个词 :math:`i` : a. 抽取主题分配 :math:`z_{di} \sim \mathrm{Multinomial}(\theta_d)` b. 抽取观察到的词 :math:`w_{ij} \sim \mathrm{Multinomial}(\beta_{z_{di}})` 对于参数估计,后验分布为: .. math:: p(z, \theta, \beta |w, \alpha, \eta) = \frac{p(z, \theta, \beta|\alpha, \eta)}{p(w|\alpha, \eta)} 由于后验难以处理,变分贝叶斯方法使用一个更简单的分布 :math:`q(z,\theta,\beta | \lambda, \phi, \gamma)` 来近似它,并且这些变分参数 :math:`\lambda` 、:math:`\phi` 、:math:`\gamma` 被优化以最大化证据下界(ELBO): .. math:: \log\: P(w | \alpha, \eta) \geq L(w,\phi,\gamma,\lambda) \overset{\triangle}{=} E_{q}[\log\:p(w,z,\theta,\beta|\alpha,\eta)] - E_{q}[\log\:q(z, \theta, \beta)] 最大化 ELBO 等价于最小化 :math:`q(z,\theta,\beta)` 和真实后验 :math:`p(z, \theta, \beta |w, \alpha, \eta)` 之间的 Kullback-Leibler(KL)散度。 :class:`LatentDirichletAllocation` 实现了在线变分贝叶斯算法,并支持在线和批量更新方法。尽管批量方法在每次完整遍历后更新变分变量, 数据,在线方法从迷你批次数据点更新变分变量。 .. note:: 尽管在线方法保证收敛到局部最优点,但最优点的质量和收敛速度可能取决于迷你批次大小和与学习率设置相关的属性。 当 :class:`LatentDirichletAllocation` 应用于“文档-词项”矩阵时,该矩阵将被分解为“主题-词项”矩阵和“文档-主题”矩阵。“主题-词项”矩阵存储在模型中的 `components_` 中,而“文档-主题”矩阵可以通过 ``transform`` 方法计算得到。 :class:`LatentDirichletAllocation` 还实现了 ``partial_fit`` 方法。当数据可以按顺序获取时,使用此方法。 .. rubric:: 示例 * :ref:`sphx_glr_auto_examples_applications_plot_topics_extraction_with_nmf_lda.py` .. rubric:: 参考文献 * `"Latent Dirichlet Allocation" `_ D. Blei, A. Ng, M. Jordan, 2003 * `"Online Learning for Latent Dirichlet Allocation” `_ M. Hoffman, D. Blei, F. Bach, 2010 * `"Stochastic Variational Inference" `_ M. Hoffman, D. Blei, C. Wang, J. Paisley, 2013 * `"The varimax criterion for analytic rotation in factor analysis" `_ H. F. Kaiser, 1958 另请参阅 :ref:`nca_dim_reduction` 以了解使用邻域成分分析进行降维。