【问题标题】:Can I fix the mean of one component of a Gaussian Mixture Model in python before fitting?我可以在拟合之前在 python 中修复高斯混合模型的一个分量的平均值吗?
【发布时间】:2020-03-04 04:02:44
【问题描述】:

我有兴趣将 2 分量高斯混合模型拟合到下面显示的数据。 但是,由于我在这里绘制的是标准化为 0-1 之间的对数转换计数,这是我的数据的最大值will ever take is 0. 当我尝试使用 sklearn.mixture.GaussianMixture(下面的代码)进行简单拟合时,我得到了结果拟合,这显然不是我想要的。

from sklearn.mixture import GaussianMixture
import numpy as np

# start with some count data in (0,1]
logged_counts = np.log(counts)
model = GaussianMixture(2).fit(logged_counts.reshape(-1,1))

# plot resulting fit
x_range = np.linspace(np.min(logged_counts), 0, 1000)
pdf = np.exp(model.score_samples(x_range.reshape(-1, 1)))
responsibilities = model.predict_proba(x_range.reshape(-1, 1))
pdf_individual = responsibilities * pdf[:, np.newaxis]

plt.hist(logged_counts, bins='auto', density=True, histtype='stepfilled', alpha=0.5)
plt.plot(x_range, pdf, '-k', label='Mixture')
plt.plot(x_range, pdf_individual, '--k', label='Components')
plt.legend()
plt.show()

如果我可以将顶部分量的均值固定为 0,并且只优化另一个均值、两个方差和混合分数,我会很高兴。 (此外,我希望能够为右侧的组件使用半正常值。)是否有一种简单的方法可以使用 python/sklearn 中的内置函数来做到这一点,或者我必须自己构建该模型使用某种概率编程语言?

【问题讨论】:

  • 请分享您迄今为止为制作情节所做的尝试;看看如何创建minimal reproducible example
  • @desertnaut 谢谢你的建议,刚刚做了!

标签: python scikit-learn gmm mixture


【解决方案1】:

Sklearn 提供了固定单个分布的均值(也称为“位置”)的可能性,如图所示,例如在this other answer。这样做的方法是向fit 方法提供floc 参数(代表“固定位置”)。

但是,正如 Drey 所提到的,这对于 GMM 来说是不可能的。如果我们仔细查看代码,我们可以看到 GaussianMixture extends BaseMixture。当我们查看the corresponding fit method 时,我们观察到它执行了一个期望最大化算法,并且它不承认任何来自固定结果之类的东西。

将这个功能添加到现有代码中可能会涉及与 EM 实现的激烈争论,并且可能会导致比其他任何事情更多的问题。

这就是说,GMM 似乎确实不是这种分布的最佳模型。仔细观察,似乎混合了 beta 发行版可能会奏效。

令人惊叹的 Python 库 pomegranate 它非常易于使用,并且允许您拟合任意分布的混合。在这里您可以看到支持的发行版的代码,似乎存在 beta:

https://pomegranate.readthedocs.io/en/latest/

干杯!
安德烈斯

【讨论】:

  • 谢谢 Andres,我会去看看这个库,它看起来很有趣。 (虽然事实证明,天真的 GMM 让我完成了大约 90% 的工作,所以我不确定我到底有多在意让它完全正确,哈哈……)。干杯本。
  • exp 分布的错误在尾部大量堆积。如果您正在处理可能很好的中心值,但要小心异常值
【解决方案2】:

Afaik,你不能完全在 sklearn 中做你想做的事。

恕我直言,基本上有多种策略:(i) 自己实现 GMM,(ii) 切换到另一种语言/框架,(iii) 调整 GMM 代码,或 (iv) 调整。


(i) 除非您想自己学习,否则您可能不想这样做。


(ii) 您可以使用stan 并修改最后一段中的代码,使其具有您选择的固定组件(分发类型和参数)


(iii) 您可以做 (i) 但稍微调整 the sklearn code 或简单地使用估计方法但您自己稍作修改。


(iv)

  • 高斯混合模型在这里不起作用(如您所述),因为您需要“第一个”(固定)分量的截断正态分布。
  • 如果您不需要拟合固定分量的方差,那么您始终可以从数据中减去您的固定分量。 (即对于每个点,从点值中减去该点的分位数值)
  • 如果您不介意估算的精度,您可以让两个通过:首先使用 GMM 识别两个组件。然后只查看要修复的组件中的数据。适合a truncated gaussian model(使用.fit(data))。然后从原始数据中减去结果参数(如选项 2)。然后安装一个 GMM。找出下一个组件。

希望这会有所帮助:-)

【讨论】:

    猜你喜欢
    • 2015-04-19
    • 2018-07-19
    • 2020-08-12
    • 2017-02-26
    • 2014-08-02
    • 1970-01-01
    • 2014-10-25
    • 2021-09-30
    • 1970-01-01
    相关资源
    最近更新 更多