Как я могу сделать гистограмму с 1D гауссовой смесью со sklearn? - PullRequest
0 голосов
/ 15 марта 2019

Я хотел бы сделать гистограмму со смесью 1D гауссов в качестве рисунка.

enter image description here

Спасибо Мэн за изображение.

Моя гистограмма такова:

enter image description here

У меня есть файл с большим количеством данных (4 000 000 чисел) в столбце:

1.727182
1.645300
1.619943
1.709263
1.614427
1.522313

И я использую следующий сценарий с изменениями, которые сделали Мэн и Лорд Справедливости:

from matplotlib import rc
from sklearn import mixture
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
import matplotlib.ticker as tkr
import scipy.stats as stats

x = open("prueba.dat").read().splitlines()

f = np.ravel(x).astype(np.float)
f=f.reshape(-1,1)
g = mixture.GaussianMixture(n_components=3,covariance_type='full')
g.fit(f)
weights = g.weights_
means = g.means_
covars = g.covariances_

plt.hist(f, bins=100, histtype='bar', density=True, ec='red', alpha=0.5)
plt.plot(f,weights[0]*stats.norm.pdf(f,means[0],np.sqrt(covars[0])), c='red')
plt.rcParams['agg.path.chunksize'] = 10000

plt.grid()
plt.show()

И когда я запускаю сценарий, у меня есть следующий сюжет:

enter image description here

Итак, я понятия не имею, как поставить начало и конец всех гауссов, которые должны быть там.Я новичок в Python, и я путаю с тем, как использовать модули.Пожалуйста, можете ли вы помочь мне и направить меня, как я могу сделать этот сюжет?

Большое спасибо

1 Ответ

1 голос
/ 15 марта 2019

Все дело в изменении. Во-первых, вам нужно изменить форму е. Для pdf измените форму перед использованием stats.norm.pdf. Точно так же сортируйте и изменяйте форму перед построением.

from matplotlib import rc
from sklearn import mixture
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
import matplotlib.ticker as tkr
import scipy.stats as stats

# x = open("prueba.dat").read().splitlines()

# create the data
x = np.concatenate((np.random.normal(5, 5, 1000),np.random.normal(10, 2, 1000)))

f = np.ravel(x).astype(np.float)
f=f.reshape(-1,1)
g = mixture.GaussianMixture(n_components=3,covariance_type='full')
g.fit(f)
weights = g.weights_
means = g.means_
covars = g.covariances_

plt.hist(f, bins=100, histtype='bar', density=True, ec='red', alpha=0.5)

f_axis = f.copy().ravel()
f_axis.sort()
plt.plot(f_axis,weights[0]*stats.norm.pdf(f_axis,means[0],np.sqrt(covars[0])).ravel(), c='red')

plt.rcParams['agg.path.chunksize'] = 10000

plt.grid()
plt.show()

enter image description here

...