首页 > 解决方案 > 我可以在拟合之前在 python 中修复高斯混合模型的一个分量的平均值吗?

问题描述

我有兴趣将 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 中的内置函数来做到这一点,或者我必须自己构建该模型使用一些概率编程语言?

标签: pythonscikit-learngmmmixture

解决方案


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

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


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


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


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


(四)

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

希望这可以帮助 :-)


推荐阅读