我从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]])
我期望得到的结果是更类似于香草GMM; 也就是说,2个高斯(大约值1和6),具有非均匀权重(如[0.625,0.375])。 我所期望的“未使用”高斯至接近零的权重。
我使用的型号不正确?
我也试着改变阿尔法没有任何的运气。
不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)
此函数滤除redundand(空)组分,即那些不用于预测,和打印装置,重量和共变。
如果一个从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)类之间迁移,和方法是无法推断正确的模型paramethers。 其中一个原因是集群paramether,阿尔法是太大了我们的集群,只含有3元每个,我们可以尝试通过降低此paramether更好, 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方法的stohastic性质,方法是unabile推断模型结构在小簇的情况下。 事情变得更好,和方法,更表现如预期,如果我们延长观察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]]
总之,要小心方法拟合paramethers,并意识到的事实,一些ML方法不小的或偏斜数据集的情况下很好地工作的。