我想使用 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 中对我的数据进行聚类的最佳方式是什么?