包含高斯函数python的词条( 二 )


尽管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估计器实际上包含计算这两者的内置方法,因此在这种方法上操作非常容易 。
让我们看看在moon数据集中 , 使用AIC和BIC函数确定GMM组件数量:
最佳的聚类数目是使得AIC或BIC最小化的值,具体取决于我们希望使用的近似值 。AIC告诉我们,我们上面选择的16个组件可能太多了:大约8-12个组件可能是更好的选择 。与此类问题一样,BIC建议使用更简单的模型 。
注意重点:这个组件数量的选择衡量GMM作为密度估算器的效果,而不是它作为聚类算法的效果 。我鼓励您将GMM主要视为密度估算器,并且只有在简单数据集中保证时才将其用于聚类 。
我们刚刚看到了一个使用GMM作为数据生成模型的简单示例,以便根据输入数据定义的分布创建新样本 。在这里,我们将运行这个想法 , 并从我们以前使用过的标准数字语料库中生成新的手写数字 。
首先 , 让我们使用Scikit-Learn的数据工具加载数字数据:
接下来让我们绘制前100个,以准确回忆我们正在看的内容:
我们有64个维度的近1,800位数字,我们可以在这些位置上构建GMM以产生更多 。GMM可能难以在如此高维空间中收敛,因此我们将从数据上的可逆维数减少算法开始 。在这里,我们将使用一个简单的PCA,要求它保留99%的预测数据方差:
结果是41个维度,减少了近1/3,几乎没有信息丢失 。根据这些预测数据,让我们使用AIC来计算我们应该使用的GMM组件的数量:
似乎大约110个components最小化了AIC;我们将使用这个模型 。我们迅速将其与数据拟合并确保它已收敛合:
现在我们可以使用GMM作为生成模型在这个41维投影空间内绘制100个新点的样本:
最后 , 我们可以使用PCA对象的逆变换来构造新的数字:
大部分结果看起来像数据集中合理的数字!
考虑一下我们在这里做了什么:给定一个手写数字的样本,我们已经模拟了数据的分布,这样我们就可以从数据中生成全新的数字样本:这些是“手写数字”,不是单独的出现在原始数据集中,而是捕获混合模型建模的输入数据的一般特征 。这种数字生成模型可以证明作为贝叶斯生成分类器的一个组成部分非常有用,我们将在下一节中看到 。

推荐阅读