2.1. 高斯混合模型#

sklearn.mixture 是一个包,它使人们能够学习高斯混合模型(支持对角、球面、绑定和完全协方差矩阵),对其进行采样,并从数据中估计它们。还提供了有助于确定合适组件数量的工具。

../_images/sphx_glr_plot_gmm_pdf_001.png

双组分高斯混合模型: 数据点和模型的等概率表面。#

高斯混合模型是一种概率模型,它假设所有数据点都是由有限数量的具有未知参数的高斯分布混合生成的。人们可以将混合模型视为 k-means 聚类的推广,以将有关数据协方差结构以及潜在高斯中心的信息纳入其中。

Scikit-learn 实现了不同的类来估计高斯混合模型,这些类对应于下面详述的不同估计策略。

2.1.1. 高斯混合#

GaussianMixture 对象实现了用于拟合高斯混合模型的期望最大化 (EM) 算法。它还可以绘制多元模型的置信椭圆,并计算贝叶斯信息准则以评估数据中的簇数。提供了 GaussianMixture.fit 方法,该方法从训练数据中学习高斯混合模型。给定测试数据,它可以使用 GaussianMixture.predict 方法将每个样本分配给它最可能属于的高斯。

GaussianMixture 带有不同的选项来约束估计的不同类的协方差:球面、对角、绑定或完全协方差。

../_images/sphx_glr_plot_gmm_covariances_001.png

示例

GaussianMixture 类的优缺点#

优点

速度:

它是学习混合模型的最快算法

不可知:

由于该算法只最大化似然,因此它不会将均值偏向零,也不会将簇大小偏向可能适用或不适用的特定结构。

缺点

奇异性:

当每个混合的点的数量不足时,估计协方差矩阵变得困难,并且已知算法会发散并找到具有无限似然的解,除非人工正则化协方差。

组件数量:

该算法将始终使用它可以访问的所有组件,在没有外部线索的情况下,需要保留数据或信息理论标准来决定使用多少组件。

在经典高斯混合模型中选择组件数量#

BIC 准则可用于以有效方式在高斯混合中选择组件数量。在理论上,它仅在渐近状态下恢复真实的组件数量(即,如果有大量数据可用,并假设数据实际上是从高斯分布的混合中独立同分布生成的)。请注意,使用变分贝叶斯高斯混合可以避免为高斯混合模型指定组件数量。

../_images/sphx_glr_plot_gmm_selection_002.png

示例

估计算法期望最大化#

从无标签数据中学习高斯混合模型的主要困难在于,人们通常不知道哪些点来自哪个潜在组件(如果可以访问此信息,则为每组点拟合单独的高斯分布变得非常容易)。期望最大化是一种经过充分验证的统计算法,可通过迭代过程解决此问题。首先,假设随机组件(随机集中在数据点上,从 k-means 中学习,甚至只是围绕原点正态分布),并计算每个点被模型中每个组件生成的概率。然后,调整参数以最大化给定这些分配的数据似然。重复此过程保证始终收敛到局部最优。

初始化方法的选择#

有四种初始化方法(以及输入用户定义的初始均值)可用于生成模型组件的初始中心

k-means(默认)

这应用传统的 k-means 聚类算法。与其他初始化方法相比,这可能在计算上很昂贵。

k-means++

这使用 k-means 聚类的初始化方法:k-means++。这将从数据中随机选择第一个中心。随后的中心将从数据的加权分布中选择,偏向于远离现有中心的点。k-means++ 是 k-means 的默认初始化,因此比运行完整的 k-means 要快,但对于具有许多组件的大型数据集仍然可能需要大量时间。

random_from_data

这将从输入数据中选择随机数据点作为初始中心。这是一种非常快的初始化方法,但如果所选点彼此太近,可能会产生不收敛的结果。

random

中心被选择为与所有数据的均值略有偏差。这种方法很简单,但可能导致模型收敛时间更长。

../_images/sphx_glr_plot_gmm_init_001.png

示例

2.1.2. 变分贝叶斯高斯混合#

BayesianGaussianMixture 对象实现了具有变分推理算法的高斯混合模型的变体。API 类似于 GaussianMixture 定义的 API。

估计算法:变分推理

变分推理是期望最大化的扩展,它最大化模型证据(包括先验)的下限而不是数据似然。变分方法背后的原理与期望最大化相同(即两者都是迭代算法,交替寻找每个点被每个混合生成的概率,并根据这些分配的点拟合混合),但变分方法通过整合先验分布中的信息来添加正则化。这避免了在期望最大化解中经常发现的奇异性,但给模型引入了一些微妙的偏差。推理通常明显变慢,但通常不会慢到无法实际使用的程度。

由于其贝叶斯性质,变分算法需要比期望最大化更多的超参数,其中最重要的是集中参数 weight_concentration_prior。为集中先验指定一个低值将使模型将大部分权重放在几个组件上,并将剩余组件的权重设置为非常接近零。高集中先验值将允许更多数量的组件在混合中处于活动状态。

BayesianGaussianMixture 类的参数实现为权重分布提出了两种类型的先验:具有狄利克雷分布的有限混合模型和具有狄利克雷过程的无限混合模型。在实践中,狄利克雷过程推理算法是近似的,并使用具有固定最大组件数量的截断分布(称为折棍表示)。实际使用的组件数量几乎总是取决于数据。

下图比较了对于 weight_concentration_prior 的不同值,不同类型的权重集中先验(参数 weight_concentration_prior_type)获得的结果。在这里,我们可以看到 weight_concentration_prior 参数的值对获得的有效活动组件数量有很大影响。我们还可以注意到,当先验类型为“dirichlet_distribution”时,集中权重先验的大值会导致更均匀的权重,而对于“dirichlet_process”类型(默认使用)则不一定是这种情况。

plot_bgmm plot_dpgmm

下面的示例将具有固定组件数量的高斯混合模型与具有狄利克雷过程先验的变分高斯混合模型进行比较。在这里,一个经典的高斯混合模型以 5 个组件拟合到由 2 个簇组成的数据集上。我们可以看到,具有狄利克雷过程先验的变分高斯混合能够将自身限制为仅 2 个组件,而高斯混合则以固定数量的组件拟合数据,必须由用户先验设置。在这种情况下,用户选择了 n_components=5,这与该玩具数据集的真实生成分布不匹配。请注意,只有很少的观测值时,具有狄利克雷过程先验的变分高斯混合模型可以采取保守立场,只拟合一个组件。

../_images/sphx_glr_plot_gmm_001.png

在下图中,我们拟合了一个高斯混合模型未能很好描述的数据集。调整 BayesianGaussianMixture 的参数 weight_concentration_prior,控制用于拟合此数据的组件数量。我们还在最后两个图上展示了从两个结果混合中生成的随机采样。

../_images/sphx_glr_plot_gmm_sin_001.png

示例

使用 BayesianGaussianMixture 进行变分推理的优缺点#

优点

自动选择:

weight_concentration_prior 足够小且 n_components 大于模型认为必要的数量时,变分贝叶斯混合模型自然倾向于将某些混合权重值设置为接近零。这使得模型能够自动选择合适的有效组件数量。只需要提供此数量的上限。然而,请注意,“理想”的活动组件数量是非常特定于应用程序的,并且在数据探索设置中通常定义不明确。

对参数数量的敏感性较低:

与有限模型(几乎总是尽可能多地使用所有组件,因此会针对不同数量的组件产生截然不同的解决方案)不同,具有狄利克雷过程先验的变分推理(weight_concentration_prior_type='dirichlet_process')不会随参数更改而变化太大,从而导致更高的稳定性和更少的调整。

正则化:

由于结合了先验信息,变分解比期望最大化解具有更少的病态特例。

缺点

速度:

变分推理所需的额外参数化使得推理变慢,尽管慢不了多少。

超参数:

该算法需要一个额外的超参数,可能需要通过交叉验证进行实验调整。

偏差:

推理算法中(以及如果使用狄利克雷过程)存在许多隐式偏差,每当这些偏差与数据不匹配时,使用有限混合拟合更好的模型是可能的。

2.1.2.1. 狄利克雷过程#

在这里,我们描述了狄利克雷过程混合上的变分推理算法。狄利克雷过程是对具有无限、无界分区数量的聚类的先验概率分布。变分技术使我们能够将这种先验结构合并到高斯混合模型中,而推理时间几乎没有惩罚,与有限高斯混合模型相比。

一个重要的问题是狄利克雷过程如何能够使用无限、无界数量的簇,并且仍然保持一致性。虽然完整的解释不适合本手册,但可以将其折棍过程类比来帮助理解它。折棍过程是狄利克雷过程的生成故事。我们从一根单位长度的棍子开始,在每一步中,我们折断剩余棍子的一部分。每次,我们将棍子的长度与落入混合组的点比例相关联。最后,为了表示无限混合,我们将棍子最后剩余的部分与未落入所有其他组的点比例相关联。每段的长度都是一个随机变量,其概率与集中参数成比例。较小的集中值将单位长度划分为较大的棍子部分(定义更集中的分布)。较大的集中值将创建较小的棍子部分(增加具有非零权重的组件数量)。

狄利克雷过程的变分推理技术仍然使用这个无限混合模型的有限近似,但不是必须先验指定要使用多少组件,而是只指定集中参数和混合组件数量的上限(这个上限,假设它高于“真实”组件数量,只会影响算法复杂度,而不会影响实际使用的组件数量)。