Нанесите оценочные гауссовы компоненты из GMM на гистограмму - PullRequest
0 голосов
/ 31 января 2019

У меня есть некоторые 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 голосов
/ 31 января 2019

ОБНОВЛЕНИЕ:

Я решил свою проблему, масштабируя каждый компонент по его весу, и, чтобы наложить его на ненормированную гистограмму, я масштабировал его по общей площади его ячеек.

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)
...