从GMM绘制直方图估计高斯要素

时间:2019-01-31 11:13:24

标签: python scikit-learn scipy gaussian gmm

我具有从两个正态分布检索的某些1- d的数据。我的目标是估计两个不同的高斯要素。

plt.hist(my_data, bins=100, edgecolor= 'white' normed=False)

My data

我使用GMM(高斯混合模型)。

clf = mixture.GaussianMixture(n_components=2)
clf.fit(my_data)

我找回了我的两个高斯人。

mean_1 = clf.means_[0][0]
mean_2 = clf.means_[1][0]
std_1 = np.sqrt(clf.covariances_[0][0])[0]
std_2 = np.sqrt(clf.covariances_[1][0])[0]
weight_1 = weights[0]
weight_2 = weights[1]

现在要问的是,我想用我上面具有的高斯参数覆盖直方图。我想我首先要范数直方图,但我怎么绘制出来,使每个高斯权正确,且总面积等于1,以及我如何覆盖在非赋范直方图的顶部区域?

xmin, xmax = plt.xlim()
x = np.linspace(xmin, xmax, 500)
y = norm.pdf(x, mean_1, std_1)
plt.plot(x,y)

y = norm.pdf(x, mean_2, std_2)
plt.plot(x,y)

上面的代码块给了我两个规范的高斯图,但是它们都具有相同的面积。

1 个答案:

答案 0 :(得分:0)

更新:

我通过按比例缩放每个组件的权重来解决我的问题,并将其覆盖在未归一的直方图上,然后按其垃圾箱的总面积进行缩放。

val, bins, _ = plt.hist(my_data, bins=100,  edgecolor = 'white', 
               normed=False)

area = sum(np.diff(bins)*val)  +  sum(np.diff(bins)*val)

y = norm.pdf(x, mean_1, std_1)*weight_1*area
plt.plot(x,y)

y = norm.pdf(x, mean_2, std_2)*weight_2*area
plt.plot(x,y)