如何使用sklearn与一维高斯混合进行直方图绘制?

时间:2019-03-15 16:36:12

标签: python matplotlib scikit-learn histogram gmm

我想用一维高斯混合图像做直方图。

enter image description here

感谢蒙的图片。

我的直方图是这样:

enter image description here

我在一个列中有一个包含大量数据(4,000,000个数字)的文件:

1.727182
1.645300
1.619943
1.709263
1.614427
1.522313

我正在使用以下脚本,但修改过孟和大法官罗德(Justice Lord):

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 个答案:

答案 0 :(得分:1)

全部与重塑有关。 首先,您需要重塑f。 对于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