我在scikit中提炼出混合物建模的问题,请学习以下一维示例。简单地将混合模型拟合到1D密度。我使用简单的GMM表现出良好的性能,但使用变分或Dirichlet过程GMM的奇怪行为。首先,拟合非常差,其次,推断的分布不规范化(参见下面的代码和图像)。
示例http://scikit-learn.org/stable/auto_examples/mixture/plot_gmm_pdf.html中显示了同样的行为。 GMM类返回的概率近似正常化,而DPGMM返回的概率则不然。通过附加以下行来计算标准化:
print np.sum(np.exp(-Z)) * (x[1] - x[0]) * (y[1] - y[0])
这是一个错误,还是我做错了什么?
代码:
import numpy as np
import numpy.random as rndn
import sklearn.mixture as skmix
import matplotlib.pyplot as plt
X = rnd.randn(0.7 * 300, 1) - 5
X = np.vstack((X, rnd.randn(0.3 * 300, 1) * 0.3 + 3))
# gmm = skmix.GMM(2)
gmm = skmix.DPGMM(2)
gmm.fit(X)
x = np.linspace(-10, 10, 1000)
p = np.exp(gmm.score(x))
plt.hist(X, bins=50, normed=True)
plt.plot(x, p)
plt.show()
integral = np.sum(p) * (x[1] - x[0])
print integral