我可以在拟合之前修复 python 中高斯混合模型的一个分量的平均值吗?

Ben*_*hty 5 python scikit-learn mixture gmm

我有兴趣将 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()
Run Code Online (Sandbox Code Playgroud)

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

Dre*_*rey 4

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

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


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


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


(iii) 您可以执行 (i),但稍微调整sklearn 代码,或者简单地使用估计方法,但您自己稍加修改。


(四)

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

希望这可以帮助 :-)