Scikit-Learn 的 DPGMM 拟合:组件数量?

Posted

技术标签:

【中文标题】Scikit-Learn 的 DPGMM 拟合:组件数量?【英文标题】:Scikit-Learn's DPGMM fitting: number of components? 【发布时间】:2016-11-26 11:13:14 【问题描述】:

我正在尝试使用 scikit-learn 的 DPGMM 算法将混合法线模型拟合到一些数据中。 [0] 上宣传的优点之一是我不需要指定组件的数量;这很好,因为我不知道数据中的组件数量。文档指出我只需要指定一个上限。但是,看起来很不真实:

>>> data = numpy.random.normal(loc = 0.0, scale = 1.0, size = 1000) 
>>> from sklearn.mixture import DPGMM
>>> d = DPGMM(n_components=5)
>>> d.fit(data.reshape(-1,1))
DPGMM(alpha=1.0, covariance_type='diag', init_params='wmc', min_covar=None,
   n_components=5, n_iter=10, params='wmc', random_state=None, thresh=None,
   tol=0.001, verbose=0)
>>> d.n_components
5
>>> d.means_
array([[-0.02283383],
       [ 0.06259168],
       [ 0.00390097],
       [ 0.02934676],
       [-0.05533165]])

如您所见,即使对于仅从一个正态分布中明显采样的数据,拟合也会报告五个分量(上限)。

我做错了吗?我是不是误会了什么?

非常感谢,

卢卡斯

[0]http://scikit-learn.org/stable/modules/mixture.html#dpgmm

【问题讨论】:

您为什么希望算法能够识别出一个组件就足够了?这是一个难题,该算法是一种没有强有力保证的启发式算法。来自您的链接:only an upper bound of this number needs to be provided. Note however that the DPMM is not a formal model selection procedure, and thus provides no guarantee on the result. 图片there 向您展示了可能发生的情况(取决于 alpha:选择 1 或 4 个组件),并且该算法有自己的调整参数 alpha 控制它 我意识到这是一个难题,算法只是一种启发式算法;但是,如果它总是导致最大数量的集群,那么启发式是无用的吗?我现在尝试使用从单个正态分布中提取的 10^-10、n_iter=1000 和 100000 个数据点的 alpha。我认为这是“最简单的问题”,它仍然会导致 10 个集群。换句话说:我无法构建算法确实没有完全失败的任何情况,所以我目前认为我做错了什么...... np.bincount(d.predict(data.reshape(-1, 1))) 返回array([1000])。该算法正确地将所有训练点分配给单个混合分量。 【参考方案1】:

我最近对这种 DPGMM 实施的结果也有类似的疑问。如果您检查提供的example,您会注意到 DPGMM 总是返回带有 n_components 的模型,现在的诀窍是删除冗余组件。这可以通过 predict 函数来完成。

不幸的是,这个重要的图片隐藏在代码示例的注释中。

# 因为 DP 不会使用它有权访问的每个组件 # 除非它需要它,否则我们不应该绘制冗余组件

【讨论】:

鉴于 API 如何删除这些冗余集群,我仍然不清楚。该示例仅使用plot()***.com/questions/40198251/…【参考方案2】:

也许考虑使用改进的 sklearn 解决方案来解决此类问题,即Bayesian Gaussian Mixture。使用此模型,必须给出建议的先前组件数量,但是一旦训练,模型就会为每个组件分配权重,这基本上表明了它们的相关性。 Here 是一个非常酷的 BGMM 视觉演示。

一旦您尝试在数据上训练几个 BGMM,您就可以对给定问题的组件数量进行合理的估计。

【讨论】:

这个相关问题的答案可能会提供一些代码来帮助:***.com/questions/40198251/… 哦,您可能想知道 DPGMM 和 BGMM 之间的区别是什么,请查看此处了解详细信息:github.com/scikit-learn/scikit-learn/issues/7623

以上是关于Scikit-Learn 的 DPGMM 拟合:组件数量?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 scikit-learn 将多项式曲线拟合到数据中?

scikit-learn:如何使用拟合概率模型?

scikit-learn 拟合函数分类

用 scikit-learn 拟合向量自回归模型

Scikit-Learn 逻辑回归严重过拟合数字分类训练数据

并行拟合 scikit-learn 模型?