我正在努力完成一项相当简单的任务。我有一个浮点矢量,我想用两个高斯核来拟合高斯混合模型:
from sklearn.mixture import GMM
gmm = GMM(n_components=2)
gmm.fit(values) # values is numpy vector of floats
我现在想绘制我创建的混合模型的概率密度函数,但我似乎无法找到有关如何执行此操作的任何文档。我该怎么办?
编辑:
Here是我适合的数据向量。以下是我如何做事的更详细的例子:
from sklearn.mixture import GMM
from matplotlib.pyplot import *
import numpy as np
try:
import cPickle as pickle
except:
import pickle
with open('/path/to/kde.pickle') as f: # open the data file provided above
kde = pickle.load(f)
gmm = GMM(n_components=2)
gmm.fit(kde)
x = np.linspace(np.min(kde), np.max(kde), len(kde))
# Plot the data to which the GMM is being fitted
figure()
plot(x, kde, color='blue')
# My half-baked attempt at replicating the scipy example
fit = gmm.score_samples(x)[0]
plot(x, fit, color='red')
拟合的曲线看起来不像我期望的那样。它甚至看起来都不是高斯,因为它是由高斯过程产生的,所以有点奇怪。我疯了吗?
看看Github上的scikit-learn示例之一
https://github.com/scikit-learn/scikit-learn/blob/master/examples/mixture/plot_gmm_pdf.py
想法是生成meshgrid
,从score
得到他们的gmm
,并绘制它。
示例显示
看看这个链接:
http://www.astroml.org/book_figures/chapter4/fig_GMM_1D.html
他们展示了如何以3种不同的方式绘制1D GMM:
1D GMM plots http://www.astroml.org/_images/fig_GMM_1D_1.png
我按照本主题和其他人提到的一些例子,设法更接近解决方案,但最终概率密度函数没有集成到一个。我想,我会在另一个帖子中发布这个问题。
import ntumpy as np
import matplotlib.pyplot as plt
from sklearn.mixture import GaussianMixture
np.random.seed(1)
mus = np.array([[0.2], [0.8]])
sigmas = np.array([[0.1], [0.1]]) ** 2
gmm = GaussianMixture(2)
gmm.means_ = mus
gmm.covars_ = sigmas
gmm.weights_ = np.array([0.5, 0.5])
#Fit the GMM with random data from the correspondent gaussians
gaus_samples_1 = np.random.normal(mus[0], sigmas[0], 10).reshape(10,1)
gaus_samples_2 = np.random.normal(mus[1], sigmas[1], 10).reshape(10,1)
fit_samples = np.concatenate((gaus_samples_1, gaus_samples_2))
gmm.fit(fit_samples)
fig = plt.figure()
ax = fig.add_subplot(111)
x = np.linspace(0, 1, 1000).reshape(1000,1)
logprob = gmm.score_samples(x)
pdf = np.exp(logprob)
#print np.max(pdf) -> 19.8409464401 !?
ax.plot(x, pdf, '-k')
plt.show()