.. _mixture: .. _gmm: ======================= 高斯混合模型 ======================= .. currentmodule:: sklearn.mixture ``sklearn.mixture`` 是一个包,使您能够学习高斯混合模型(支持对角线、球形、约束和完全协方差矩阵),从中采样,并从数据中估计它们。还提供了帮助确定适当组件数量的工具。 .. figure:: ../auto_examples/mixture/images/sphx_glr_plot_gmm_pdf_001.png :target: ../auto_examples/mixture/plot_gmm_pdf.html :align: center :scale: 50% **两个分量的高斯混合模型:** *数据点,以及模型的等概率表面。* 高斯混合模型是一个概率模型,假设所有数据点都是从有限数量的高斯分布混合生成的,这些高斯分布的参数是未知的。可以认为混合模型是将对数据的协方差结构以及潜在高斯中心的考虑纳入其中的 k-means 聚类的推广。 Scikit-learn 实现了不同的类来估计高斯混合模型,这些类对应于不同的估计策略,详情如下。 高斯混合 ================ :class:`GaussianMixture` 对象实现了用于拟合混合高斯模型的 :ref:`期望最大化 ` (EM)算法。它还可以为多变量模型绘制置信椭球,并计算贝叶斯信息准则来评估数据中的聚类数量。提供了一个 :meth:`GaussianMixture.fit` 方法,用于从训练数据中学习高斯混合模型。给定测试数据,可以使用 :meth:`GaussianMixture.predict` 方法将每个样本分配给最可能属于的高斯分布。 .. 或者,可以使用 :meth:`GaussianMixture.predict_proba` 方法检索每个样本属于各个高斯的概率。 :class:`GaussianMixture` 提供了不同的选项来约束估计的差异类别的协方差:球形的、对角的、绑定的或完全的协方差。 .. figure:: ../auto_examples/mixture/images/sphx_glr_plot_gmm_covariances_001.png :target: ../auto_examples/mixture/plot_gmm_covariances.html :align: center :scale: 75% .. rubric:: 示例 * 参见 :ref:`sphx_glr_auto_examples_mixture_plot_gmm_covariances.py` 以了解在鸢尾花数据集上使用高斯混合进行聚类的示例。 * 参见 :ref:`sphx_glr_auto_examples_mixture_plot_gmm_pdf.py` 以了解绘制密度估计的示例。 .. dropdown:: GaussianMixture 类的优缺点 .. rubric:: 优点 :速度: 它是学习混合模型最快的算法 :不可知论: 由于此算法仅最大化似然性,它不会将均值偏向零,或偏向聚类大小具有特定结构,这些结构可能适用也可能不适用。 .. rubric:: 缺点 :奇异性: 当每个混合的点数不足时,估计协方差矩阵变得困难,并且该算法已知会发散并找到具有无限似然性的解决方案,除非人为地正则化协方差。 :组件数量: 该算法将始终使用其可访问的所有组件,需要保留数据或信息理论标准来决定在没有外部提示的情况下使用多少组件。 .. dropdown:: 在经典高斯混合模型中选择组件数量 BIC 准则可以有效地用于选择高斯混合中的组件数量。理论上,它只在渐近状态下恢复真实的组件数量(即,如果有大量数据且假设数据实际上是从高斯混合分布中独立同分布生成的)。请注意,使用 :ref:`变分贝叶斯高斯混合 ` 避免指定高斯混合模型中组件的数量。 .. figure:: ../auto_examples/mixture/images/sphx_glr_plot_gmm_selection_002.png :target: ../auto_examples/mixture/plot_gmm_selection.html :align: center :scale: 50% .. rubric:: 示例 * 参见 :ref:`sphx_glr_auto_examples_mixture_plot_gmm_selection.py` 以了解使用经典高斯混合进行模型选择的示例。 .. _expectation_maximization: .. dropdown:: 估计算法:期望最大化 从无标签数据中学习高斯混合模型的主要困难通常是不知道哪些点来自哪个潜在组件(如果能够访问此信息,为每个点集拟合一个单独的高斯分布将变得非常容易)。 `期望最大化 `_ 是一种基于统计的算法,通过迭代过程来解决这个问题。首先,假设随机组件(随机中心位于数据点上,从k-means学习,或者甚至只是围绕原点正态分布),并计算每个点由模型中每个组件生成的概率。然后,调整参数以最大化给定这些分配的数据的可能性。重复此过程保证始终收敛到局部最优解。 .. dropdown:: 初始化方法的选择 有四种初始化方法(以及输入用户定义的初始均值)来生成模型组件的初始中心: k-means(默认) 这应用传统的k-means聚类算法。与其他初始化方法相比,这可能计算成本较高。 k-means++ 这使用k-means聚类算法的初始化方法:k-means++。这将随机从数据中选择第一个中心。后续中心将从数据中选择,以最小化距离的平方和。 从数据中加权分布选择,偏向于远离现有中心的点。k-means++ 是 k-means 的默认初始化方法,因此比运行完整的 k-means 更快,但对于具有许多组件的大型数据集,仍然可能需要相当长的时间。 random_from_data 这将从未输入数据中随机选择数据点作为初始中心。这是一种非常快速的初始化方法,但如果选择的点彼此过于接近,可能会产生不收敛的结果。 random 中心点选择为所有数据均值附近的小扰动。这种方法简单,但可能导致模型收敛时间更长。 .. figure:: ../auto_examples/mixture/images/sphx_glr_plot_gmm_init_001.png :target: ../auto_examples/mixture/plot_gmm_init.html :align: center :scale: 50% .. rubric:: 示例 * 参见 :ref:`sphx_glr_auto_examples_mixture_plot_gmm_init.py` 以了解在高斯混合模型中使用不同初始化的示例。 .. _bgmm: 变分贝叶斯高斯混合 ==================== :class:`BayesianGaussianMixture` 对象实现了使用变分推理算法的高斯混合模型变体。其 API 与 :class:`GaussianMixture` 定义的 API 类似。 .. _variational_inference: **估计算法:变分推理** 变分推理是期望最大化的一种扩展,它最大化模型证据(包括先验)的下界,而不是数据似然。变分方法背后的原理与期望最大化相同(即两者都是迭代算法,交替寻找每个点由每个混合成分生成的概率,并拟合混合成分到这些分配的点),但变分方法通过整合先验分布的信息来增加正则化。这避免了在 期望最大化中经常出现的奇异性。 期望最大化解决方案,但引入了一些细微的偏差到模型中。推理通常显著较慢,但通常不会慢到使使用变得不切实际。 由于其贝叶斯性质,变分算法需要的超参数比期望最大化更多,其中最重要的是浓度参数 ``weight_concentration_prior`` 。为浓度先验指定一个较低的值将使模型将大部分权重放在少数几个组件上,并将剩余组件的权重设置得非常接近零。浓度先验的高值将允许更多的组件在混合中活跃。 :class:`BayesianGaussianMixture` 类的参数实现提出了两种类型的权重分布先验:具有狄利克雷分布的有限混合模型和具有狄利克雷过程的无限混合模型。实际上,狄利克雷过程推理算法是近似的,并使用具有固定最大组件数量的截断分布(称为棍子折断表示)。实际使用的组件数量几乎总是取决于数据。 下图比较了不同类型的权重浓度先验(参数 ``weight_concentration_prior_type`` )在不同 ``weight_concentration_prior`` 值下获得的结果。在这里,我们可以看到 ``weight_concentration_prior`` 参数的值对获得的活动组件的有效数量有强烈影响。我们还可以注意到,当先验类型为 'dirichlet_distribution' 时,浓度权重先验的大值会导致更均匀的权重,而对于 'dirichlet_process' 类型(默认使用)则不一定如此。 .. |plot_bgmm| image:: ../auto_examples/mixture/images/sphx_glr_plot_concentration_prior_001.png :target: ../auto_examples/mixture/plot_concentration_prior.html :scale: 48% .. |plot_dpgmm| image:: ../auto_examples/mixture/images/sphx_glr_plot_concentration_prior_002.png :target: ../auto_examples/mixture/plot_concentration_prior.html :scale: 48% .. centered:: |plot_bgmm| |plot_dpgmm| 下面的示例比较了具有固定组件数量的高斯混合模型与具有Dirichlet过程先验的变分高斯混合模型。在这里,一个经典的高斯混合模型在由2个集群组成的数据集上拟合了5个组件。我们可以看到,具有Dirichlet过程先验的变分高斯混合模型能够限制自己仅使用2个组件,而高斯混合模型则使用用户事先设定的固定数量的组件来拟合数据。在这种情况下,用户选择了 ``n_components=5`` ,这与这个玩具数据集的真实生成分布不匹配。请注意,在观测数据非常少的情况下,具有Dirichlet过程先验的变分高斯混合模型可能会采取保守立场,仅拟合一个组件。 .. figure:: ../auto_examples/mixture/images/sphx_glr_plot_gmm_001.png :target: ../auto_examples/mixture/plot_gmm.html :align: center :scale: 70% 在下面的图中,我们拟合了一个不适合用高斯混合模型描述的数据集。调整:class:`BayesianGaussianMixture` 的 ``weight_concentration_prior`` 参数可以控制用于拟合这些数据的分量数量。我们还在最后两个图中展示了从两个结果混合中生成的随机样本。 .. figure:: ../auto_examples/mixture/images/sphx_glr_plot_gmm_sin_001.png :target: ../auto_examples/mixture/plot_gmm_sin.html :align: center :scale: 65% .. rubric:: 示例 * 参见:ref:`sphx_glr_auto_examples_mixture_plot_gmm.py` ,了解一个关于绘制:class:`GaussianMixture` 和:class:`BayesianGaussianMixture` 的置信椭球体的示例。 * :ref:`sphx_glr_auto_examples_mixture_plot_gmm_sin.py` 展示了使用 :class:`GaussianMixture` 和 :class:`BayesianGaussianMixture` 用于拟合正弦波。 * 参见 :ref:`sphx_glr_auto_examples_mixture_plot_concentration_prior.py` 示例,该示例绘制了不同 ``weight_concentration_prior_type`` 下 :class:`BayesianGaussianMixture` 的置信椭球,对应不同的 ``weight_concentration_prior`` 参数值。 .. dropdown:: 使用 BayesianGaussianMixture 进行变分推断的优缺点 .. rubric:: 优点 :自动选择: 当 ``weight_concentration_prior`` 足够小且 ``n_components`` 大于模型所需时,变分贝叶斯混合模型倾向于将某些混合权重值设置为接近零。这使得模型能够自动选择合适的有效分量数量。只需提供该数量的上限。但请注意,“理想”的活动分量数量非常依赖于具体应用,并且在数据探索环境中通常难以明确定义。 :对参数数量的敏感性较低: 与几乎总是尽可能使用所有分量的有限模型不同,变分推断结合 Dirichlet 过程先验 ( ``weight_concentration_prior_type='dirichlet_process'`` ) 在参数变化时不会发生太大变化,从而提高了稳定性和减少调整。 :正则化: 由于融入了先验信息,变分解的病态特殊情况比期望最大化解少。 .. rubric:: 缺点 :速度: 变分推断所需的额外参数化使得推断速度变慢,尽管幅度不大。 :超参数: 该算法需要额外的超参数,可能需要通过交叉验证进行实验性调优。 :偏差: 推断算法(如果使用Dirichlet过程,也存在)中存在许多隐含偏差,并且每当这些偏差与数据不匹配时,可能可以使用有限混合来拟合更好的模型。 .. _dirichlet_process: Dirichlet过程 -------------- 这里我们描述Dirichlet过程混合的变分推断算法。Dirichlet过程是一种在*具有无限、无界数量的分区的聚类*上的先验概率分布。变分技术使我们几乎可以在不增加推断时间的情况下,将这种先验结构纳入高斯混合模型中,与有限高斯混合模型相比。 一个重要的问题是Dirichlet过程如何使用无限、无界的聚类数量,同时仍然保持一致性。虽然完整的解释不适合本手册,但可以考虑其 `棍子断裂过程 `_ 的类比来帮助理解。棍子断裂过程是Dirichlet过程的一个生成故事。我们从一根单位长度的棍子开始,在每一步中,我们折断剩余棍子的一部分。每次,我们将棍子片段的长度与混合中落入一组的点的比例相关联。最后,为了表示无限混合,我们将最后剩余的棍子片段与未落入所有其他组的点的比例相关联。每个片段的长度是一个随机变量,其概率与浓度参数成比例。浓度值越小,将单位长度分成更大的棍子片段(定义更集中的分布)。较大的浓度值将创建更小的棍子片段(增加具有非零权重的组件数量)。 Dirichlet过程的变分推断技术仍然有效 使用这个无限混合模型的有限近似,但不是必须事先指定想要使用多少个组件,而是只需指定浓度参数和一个混合组件数量的上限(这个上限,假设它高于“真实”的组件数量,仅影响算法复杂度,而不影响实际使用的组件数量)。