我想使用sklearn.mixture.GMM将高斯混合物拟合到一些数据中,结果类似于我使用R" Mclust"包。
数据如下所示:
所以这里是我如何使用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 :(得分:1)
诀窍是设置GMM&#39> min_covar 。所以在这种情况下,我得到了很好的结果:
mixture.GMM( n_components=14,n_iter=5000, covariance_type='full',min_covar=0.0000001)
min_covar 的较大默认值会将所有点分配给一个群集。