5

我有兴趣将 2 分量高斯混合模型拟合到下面显示的数据中。对数转换的计数比率数据,不能超过 0但是,由于我在这里绘制的是归一化为 0-1 之间的对数转换计数,因此我的数据将采用的最大值为 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()

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

4

2 回答 2

4

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

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


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


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


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


(四)

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

希望这可以帮助 :-)

于 2019-11-07T15:19:48.917 回答
1

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

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

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

这就是说,GMM 似乎确实不是这种分布的最佳模型。目不转睛地看,似乎混合了 beta 发行版可能会奏效。

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

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

干杯!
安德烈斯

于 2021-04-05T22:09:49.437 回答