2015-02-10 80 views
1

我想使用sklearn.mixture.GMM来适应一些数据的混合高斯,结果类似于我使用R的“Mclust”包得到的结果。高斯混合使用scikit学习混合

的数据是这样的: enter image description here

因此,这里就是我的集群中使用R中的数据,它给了我14个很好地分离集群,并轻而易举地上下楼梯:

data <- read.table('~/gmtest/foo.csv',sep=",") 
library(mclust) 
D = Mclust(data,G=1:20) 
summary(D) 
plot(D, what="classification") 

而这里的当我用python试用它时,我会说:

from sklearn import mixture 
import numpy as np 
import os 
import pyplot 

os.chdir(os.path.expanduser("~/gmtest")) 
data = np.loadtxt(open('foo.csv',"rb"),delimiter=",",skiprows=0) 
gmm = mixture.GMM(n_components=14,n_iter=5000, covariance_type='full') 
gmm.fit(data) 

classes = gmm.predict(data) 
pyplot.scatter(data[:,0], data[:,1], c=classes) 
pyplot.show() 

它将所有点都分配给同一个群集。我也注意到,当我告诉它找到激动人心的1簇时,拟合的AIC最低,并随着簇数量的增加而线性增加。我究竟做错了什么?我需要考虑其他参数吗?

Mclust和sklearn.mixture使用的模型有差异吗?

但更重要的是:什么是最好的方式sklearn来聚集我的数据?

+0

Mclust默认使用完全协方差吗? – 2015-02-11 00:12:34

回答

1

诀窍是设置GMM的min_covar。因此,在这种情况下,我得到了良好的效果:

mixture.GMM(n_components=14,n_iter=5000, covariance_type='full',min_covar=0.0000001) 

大的默认值min_covar所有点分配给一个集群。

+1

您的数据如何缩放?我不确定这个默认值是不是比例不变的,也许我们应该改变它...... – 2015-02-11 00:19:49

+0

我没有想到缩放数据。如果我说:'data = scale(data)',然后'gmm.fit(data)',它可以很好地与默认的_min_covar_配合使用。 – 2015-02-11 17:32:30