低版本中是GMM,VBGMM(变分GMM,自动估计高斯分布的个数)
再高版本scikit-learn 0.23.1中,
来自
GMM对应的是GaussianMixture
VBGMM对应的是BayesianGaussianMixture
高斯混合模型是一种概率模型,它假设所有的数据点都是由有限个未知参数的高斯分布混合生成的。我们可以把混合模型看作是推广k均值聚类,以包含关于数据协方差结构以及潜在高斯中心的信息。
Scikit-learn实现了不同的类来估计高斯混合模型,它们对应于不同的估计策略.
GaussianMixture的利弊
利:
1、速度
它是学习混合模型最快的算法
2、不可知论者
由于该算法只将可能性最大化,它不会将平均值偏向零,也不会使簇大小偏向于具有可能适用或不适用的特定结构。
弊:
1、奇点
当每个混合体的点数不足时,估计协方差矩阵变得困难,并且该算法是已知的发散和无限可能的解,除非人为地正则化协方差。
2、组件数量
该算法将始终使用它可以访问的所有类,需要提供数据或信息理论标准来决定在没有外部提示的情况下使用多少类。
BIC准则可以有效地选择高斯混合体中的类数目。理论上,它只在渐近状态下(即,如果有很多数据可用,并且假设数据实际上是由高斯分布的混合物生成的),它才反应真实的类数量。另外,使用变分贝叶斯-高斯混合模型可以避免为高斯混合模型指定类别的数量。
BayesianGaussianMixture
变分推理是期望最大化的扩展,它最大化了模型证据(包括先验)的下界,而不是数据的似然性。变分法背后的原理与期望最大化相同(也就是说,两者都是迭代算法,在寻找每种混合物产生的每个点的概率和将混合物拟合到这些指定点之间交替进行),但是变分法通过整合先验分布的信息来增加正则化。这避免了通常在期望最大化解中发现的奇异性,但给模型引入了一些细微的偏差。推理通常要慢得多,但通常不会使用法变得不实用。
由于其贝叶斯性质,变分算法需要比期望最大化更多的超参数,其中最重要的是集中参数权重。指定较低的浓度优先值将使模型将大部分权重放在少数组分上,将剩余组分的权重设置为非常接近零。较高的浓度优先值将允许更多的组分在混合物中活跃。
BayesianGaussianMixture类的参数实现为权重分布提出了两种类型的先验:具有Dirichlet分布的有限混合模型和具有Dirichlet过程的无限混合模型。在实际应用中,Dirichlet过程推理算法是近似的,并使用具有固定最大组件数的截断分布。实际使用的组件数量几乎总是取决于数据。
class sklearn.mixture.BayesianGaussianMixture(*, n_components=1, covariance_type='full', tol=0.001, reg_covar=1e-06, max_iter=100, n_init=1, init_params='kmeans', weight_concentration_prior_type='dirichlet_process', weight_concentration_prior=None, mean_precision_prior=None, mean_prior=None, degrees_of_freedom_prior=None, covariance_prior=None, random_state=None, warm_start=False, verbose=0, verbose_interval=10)
来自
BayesianGaussianMixture变分推理的优缺点
优点
1、自动选择
当权重-浓度先验值足够小且n个分布大于模型所需的值时,变分贝叶斯混合模型具有将某些混合权重值设置为接近零的自然趋势。这使得模型能够自动选择合适数量的有效分布。只需提供此数字的上限。但是请注意,分布的“理想”数量是非常特定于应用程序的,并且在数据探索设置中通常定义不清。
2、对参数数量的敏感性较低
与有限模型不同,有限模型几乎总是尽可能多地使用所有的分量,因此会对不同数量的分量产生不同的解,使用Dirichlet过程先验(weight_concentration_prior_type='Dirichlet_process')的变分推理不会随参数的变化而发生太大变化,带来更高的稳定性和更少的调整。
3、正规化
由于引入了先验信息,变分解比期望最大化解具有更少的bad特例。
缺点
1、速度
变分推理所需的额外参数化使推理速度变慢,尽管不是很大。
2、超参数
该算法需要一个额外的超参数,可能需要通过交叉验证进行实验调整。
3、偏见
在推理算法中(如果使用的话,在Dirichlet过程中也存在许多隐式偏差),只要这些偏差与数据不匹配,就可以使用有限混合来拟合更好的模型。
estimators = [
("Finite mixture with a Dirichlet distribution\nprior and "
r"$\gamma_0=$", BayesianGaussianMixture(
weight_concentration_prior_type="dirichlet_distribution",
n_components=2 * n_components, reg_covar=0, init_params='random',
max_iter=1500, mean_precision_prior=.8,
random_state=random_state), [0.001, 1, 1000]),
("Infinite mixture with a Dirichlet process\n prior and" r"$\gamma_0=$",
BayesianGaussianMixture(
weight_concentration_prior_type="dirichlet_process",
n_components=2 * n_components, reg_covar=0, init_params='random',
max_iter=1500, mean_precision_prior=.8,
random_state=random_state), [1, 1000, 100000])]