1

scikit Learn での混合モデリングで発生している問題を、次の 1D の例で抽出しました。混合モデルを 1D 密度に単純に適合させる。単純な GMM を使用すると良好なパフォーマンスが得られますが、Variational または Dirichlet Process 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

DPGMM 適合不良

4

0 に答える 0