我可以在拟合前确定 python 中高斯混合模型的一个分量的平均值吗?
Can I fix the mean of one component of a Gaussian Mixture Model in python before fitting?
我有兴趣将 2 分量高斯混合模型拟合到下面显示的数据。但是,由于我在这里绘制的是标准化为 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()
如果我能将顶部分量的均值固定为 0 并只优化另一个均值、两个方差和混合分数,我会很高兴。 (此外,我希望能够对右侧的组件使用半法线。)是否有一种简单的方法可以使用 python/sklearn 中的内置函数来执行此操作,或者我是否必须构建该模型我自己使用某种概率编程语言?
Afaik,你不能 完全 在 sklearn 中做你想做的事情。
恕我直言,基本上有多种策略:(i) 自己实施 GMM,(ii) 切换到另一个 language/framework,(iii) 调整 GMM 代码,或 (iv) 调整。
(我)
除非您想自己学习,否则您可能不想这样做。
(二)
您可以使用 stan 并调整最后一段中的代码以具有您选择的固定组件(分发类型和参数)
(三)
你可以做 (i) 但稍微调整 the sklearn code 或者简单地使用估计方法但你自己稍微修改。
(iv)
- Gaussian 混合模型在这里不起作用(如您所述),因为您需要 "first"(固定)分量的截断正态分布。
- 如果您不需要拟合固定分量的方差,那么您始终可以从数据中减去固定分量。 (即对于每个点,从点值中减去点的分位数)
- 如果你不介意估计的精度,你可以做两个通过:首先使用GMM来识别两个组件。然后只查看来自您要修复的组件的数据。适合 a truncated gaussian model(使用
.fit(data)
)。然后从原始数据中减去生成的参数(如选项 2)。然后安装一个 GMM。找出下一个组件。
希望这对您有所帮助:-)
Sklearn 提供了固定单个分布的均值(a.k。“位置”)的可能性,如图所示在 this other answer。这样做的方法是向 fit
方法(代表“固定位置”)提供 floc
参数。
但是,正如 Drey 所提到的,对于 GMM 来说,不可能。如果我们仔细查看代码,我们可以看到 GaussianMixture
extends BaseMixture. And when we look at the corresponding fit
method,我们观察到它执行的是期望最大化算法,并且它不接受固定结果之类的任何东西。
将此功能添加到现有代码中可能会涉及与 EM 实现的大量争论,并且它可能会导致比其他任何问题都多的问题。
这就是说,GMM 似乎确实不是那种分布的最佳模型。仔细观察,似乎混合使用 beta 分布可能会成功。
令人惊叹的 Python 库 pomegranate 它非常易于使用,并允许您拟合任意分布的混合。在这里您可以看到支持的发行版的代码,测试版似乎存在:
https://pomegranate.readthedocs.io/en/latest/
干杯!
安德烈斯
我有兴趣将 2 分量高斯混合模型拟合到下面显示的数据。
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()
Afaik,你不能 完全 在 sklearn 中做你想做的事情。
恕我直言,基本上有多种策略:(i) 自己实施 GMM,(ii) 切换到另一个 language/framework,(iii) 调整 GMM 代码,或 (iv) 调整。
(我) 除非您想自己学习,否则您可能不想这样做。
(二) 您可以使用 stan 并调整最后一段中的代码以具有您选择的固定组件(分发类型和参数)
(三) 你可以做 (i) 但稍微调整 the sklearn code 或者简单地使用估计方法但你自己稍微修改。
(iv)
- Gaussian 混合模型在这里不起作用(如您所述),因为您需要 "first"(固定)分量的截断正态分布。
- 如果您不需要拟合固定分量的方差,那么您始终可以从数据中减去固定分量。 (即对于每个点,从点值中减去点的分位数)
- 如果你不介意估计的精度,你可以做两个通过:首先使用GMM来识别两个组件。然后只查看来自您要修复的组件的数据。适合 a truncated gaussian model(使用
.fit(data)
)。然后从原始数据中减去生成的参数(如选项 2)。然后安装一个 GMM。找出下一个组件。
希望这对您有所帮助:-)
Sklearn 提供了固定单个分布的均值(a.k。“位置”)的可能性,如图所示在 this other answer。这样做的方法是向 fit
方法(代表“固定位置”)提供 floc
参数。
但是,正如 Drey 所提到的,对于 GMM 来说,不可能。如果我们仔细查看代码,我们可以看到 GaussianMixture
extends BaseMixture. And when we look at the corresponding fit
method,我们观察到它执行的是期望最大化算法,并且它不接受固定结果之类的任何东西。
将此功能添加到现有代码中可能会涉及与 EM 实现的大量争论,并且它可能会导致比其他任何问题都多的问题。
这就是说,GMM 似乎确实不是那种分布的最佳模型。仔细观察,似乎混合使用 beta 分布可能会成功。
令人惊叹的 Python 库 pomegranate 它非常易于使用,并允许您拟合任意分布的混合。在这里您可以看到支持的发行版的代码,测试版似乎存在:
https://pomegranate.readthedocs.io/en/latest/
干杯!
安德烈斯