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 将多项式曲线拟合到数据中?