pythonbic函数 python bcc( 二 )


k-means模型的一种理解思路是,它在每个类蔟的中心放置了一个圈(或者,更高维度超球面),其半径由聚类中最远的点确定 。该半径充当训练集中聚类分配的一个硬截断:任何圈外的数据点不被视为该类的成员 。我们可以使用以下函数可视化这个聚类模型:
观察k-means的一个重要发现,这些聚类模式必须是圆形的 。k-means没有内置的方法来计算椭圆形或椭圆形的簇 。因此,举例而言,假设我们将相同的数据点作变换,这种聚类分配方式最终变得混乱:
高斯混合模型(GMM)试图找到一个多维高斯概率分布的混合,以模拟任何输入数据集 。在最简单的情况下,GMM可用于以与k-means相同的方式聚类 。
但因为GMM包含概率模型,因此可以找到聚类分配的概率方式 - 在Scikit-Learn中 , 通过调用predict_proba方法实现 。它将返回一个大小为[n_samples, n_clusters]的矩阵,用于衡量每个点属于给定类别的概率:
我们可以可视化这种不确定性,比如每个点的大小与预测的确定性成比例;如下图,我们可以看到正是群集之间边界处的点反映了群集分配的不确定性:
本质上说,高斯混合模型与k-means非常相似:它使用期望-最大化的方式,定性地执行以下操作:
有了这个,我们可以看看四成分的GMM为我们的初始数据提供了什么:
同样 , 我们可以使用GMM方法来拟合我们的拉伸数据集;允许full的协方差 , 该模型甚至可以适应非常椭圆形,伸展的聚类模式:
这清楚地表明GMM解决了以前遇到的k-means的两个主要实际问题 。
如果看了之前拟合的细节,你将看到covariance_type选项在每个中都设置不同 。该超参数控制每个类簇的形状的自由度;对于任意给定的问题 , 必须仔细设置 。默认值为covariance_type =“diag” , 这意味着可以独立设置沿每个维度的类蔟大?。⒔玫降耐衷苍际胫岫云?。一个稍微简单和快速的模型是covariance_type =“spherical” , 它约束了类簇的形状,使得所有维度都相等 。尽管它并不完全等效,其产生的聚类将具有与k均值相似的特征 。更复杂且计算量更大的模型(特别是随着维数的增长)是使用covariance_type =“full” , 这允许将每个簇建模为具有任意方向的椭圆 。
对于一个类蔟,下图我们可以看到这三个选项的可视化表示:
尽管GMM通常被归类为聚类算法,但从根本上说它是一种密度估算算法 。也就是说,GMM适合某些数据的结果在技术上不是聚类模型,而是描述数据分布的生成概率模型 。
例如,考虑一下Scikit-Learn的make_moons函数生成的一些数据:
如果我们尝试用视为聚类模型的双成分的GMM模拟数据,则结果不是特别有用:
但是如果我们使用更多成分的GMM模型 , 并忽视聚类的类别,我们会发现更接近输入数据的拟合:
这里,16个高斯分布的混合不是为了找到分离的数据簇,而是为了对输入数据的整体分布进行建模 。这是分布的一个生成模型,这意味着GMM为我们提供了生成与我们的输入类似分布的新随机数据的方法 。例如,以下是从这个16分量GMM拟合到我们原始数据的400个新点:
GMM非常方便 , 可以灵活地建模任意多维数据分布 。
GMM是一种生成模型这一事实为我们提供了一种确定给定数据集的最佳组件数的自然方法 。生成模型本质上是数据集的概率分布,因此我们可以简单地评估模型下数据的可能性,使用交叉验证来避免过度拟合 。校正过度拟合的另一种方法是使用一些分析标准来调整模型可能性,例如 Akaike information criterion (AIC)或Bayesian information criterion (BIC)。Scikit-Learn的GMM估计器实际上包含计算这两者的内置方法,因此在这种方法上操作非常容易 。

推荐阅读