我从DPGMM获得的结果不是我期望的。例如。:

>>> import sklearn.mixture
>>> sklearn.__version__
'0.12-git'
>>> data = [[1.1],[0.9],[1.0],[1.2],[1.0], [6.0],[6.1],[6.1]]
>>> m = sklearn.mixture.DPGMM(n_components=5, n_iter=1000, alpha=1)
>>> m.fit(data)
DPGMM(alpha=1, covariance_type='diag', init_params='wmc', min_covar=None,
   n_components=5, n_iter=1000, params='wmc',
   random_state=<mtrand.RandomState object at 0x108a3f168>, thresh=0.01,
   verbose=False)
>>> m.converged_
True
>>> m.weights_
array([ 0.2,  0.2,  0.2,  0.2,  0.2])
>>> m.means_
array([[ 0.62019109],
       [ 1.16867356],
       [ 0.55713292],
       [ 0.36860511],
       [ 0.17886128]])

我希望结果与 Vanilla GMM更相似;也就是两个高斯(权重1和6左右),权重不均匀(例如[0.625,0.375])。我希望“未使用的”高斯人的权重接近零。

我使用模型不正确吗?

我也尝试过更改Alpha,但没有任何运气。

最佳答案

与sklearn的0.14.1版本没有太大区别。我将使用以下代码来打印DPGMM模型:

def pprint(model, data):
    idx = np.unique(model.predict(data))
    m_w_cov = [model.means_, model.weights_, model._get_covars()]
    flattened  = map(lambda x: np.array(x).flatten(), m_w_cov)
    filtered = map(lambda x: x[idx], flattened)
    print np.array(filtered)

此功能会过滤掉冗余(空)成分,即那些未用于预测的成分,并打印均值,权重和协方差。

如果使用OP问题中的数据进行多次尝试,则可以找到两种不同的结果:
>>> m = sklearn.mixture.DPGMM(n_components=5, n_iter=1000, alpha=1).fit(data)
>>> m.predict(data)
array([0, 0, 0, 0, 0, 1, 1, 1])
>>> pprint(m, data)
[[  0.62019109   1.16867356]
 [  0.10658447   0.19810279]
 [  1.08287064  12.43049771]]


>>> m = sklearn.mixture.DPGMM(n_components=5, n_iter=1000, alpha=1).fit(data)
>>> m.predict(data)
array([1, 1, 1, 0, 1, 0, 0, 0])
>>> pprint(m, data)
[[  1.24122696   0.64252404]
 [  0.17157736   0.17416976]
 [ 11.51813929   1.07829109]]

然后可以猜测出意外结果的原因在于以下事实:某些中间结果(在我们的示例中为1.2)在类之间迁移,并且方法无法推断正确的模型参数。原因之一是聚类参数,对于我们的聚类来说,alpha太大,每个元素仅包含3个元素,我们可以通过减少该参数来尝试更好,0.1将给出更稳定的结果:
>>> m = sklearn.mixture.DPGMM(n_components=5, n_iter=1000, alpha=.1).fit(data)
>>> m.predict(data)
array([1, 1, 1, 1, 1, 0, 0, 0])

但是根本原因在于DPGMM方法的随机性,在小集群的情况下,该方法无法推断模型的结构。如果我们将观察结果扩展4次,情况会变得更好,方法的行为也会更加符合预期:
>>> m = sklearn.mixture.DPGMM(n_components=5, n_iter=1000, alpha=1).fit(data*4)
>>> pprint(m, data)
[[ 0.90400296  5.46990901]
 [ 0.11166431  0.24956023]
 [ 1.02250372  1.31278926]]

总而言之,请谨慎使用方法拟合参数,并注意某些ML方法在数据集较小或偏斜的情况下效果不佳的事实。

关于python - sklearn.mixture.DPGMM : Unexpected results,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12960516/

10-12 16:37