【发布时间】:2018-02-13 02:02:04
【问题描述】:
我使用 mclust 在数据集中查找集群。现在我想将这些发现实施到外部非 r 软件中(因此,predict.Mclust 不是以前类似问题中建议的选项)来对新观察结果进行分类。我需要知道 mclust 如何对观察进行分类。
由于 mclust 为每个集群输出一个中心和一个协方差矩阵,因此为每个观测值和每个集群计算马氏距离是合理的。然后可以将观察结果分类到最近的马哈洛诺比星团。然而,它似乎并没有完全发挥作用。
带有模拟数据的示例代码(在此示例中,我仅使用一个数据集 d,并尝试通过上述 mahalanobi 方法获得与 mclust 相同的分类):
set.seed(123)
c1<-mvrnorm(100,mu=c(0,0),Sigma=matrix(c(2,0,0,2),ncol=2))
c2<-mvrnorm(200,mu=c(3,3),Sigma=matrix(c(3,0,0,3),ncol=2))
d<-rbind(c1,c2)
m<-Mclust(d)
int_class<-m$classification
clust1_cov<-m$parameters$variance$sigma[,,1]
clust1_center<-m$parameters$mean[,1]
clust2_cov<-m$parameters$variance$sigma[,,2]
clust2_center<-m$parameters$mean[,2]
mahal_clust1<-mahalanobis(d,cov=clust1_cov,center=clust1_center)
mahal_clust2<-mahalanobis(d,cov=clust2_cov,center=clust2_center)
mahal_clust_dist<-cbind(mahal_clust1,mahal_clust2)
mahal_classification<-apply(mahal_clust_dist,1,function(x){
match(min(x),x)
})
table(int_class,mahal_classification)
#List mahalanobis distance for miss-classified observations:
mahal_clust_dist[mahal_classification!=int_class,]
plot(m,what="classification")
#Indicate miss-classified observations:
points(d[mahal_classification!=int_class,],pch="X")
#Results:
> table(int_class,mahal_classification)
mahal_classification
int_class 1 2
1 124 0
2 5 171
> mahal_clust_dist[mahal_classification!=int_class,]
mahal_clust1 mahal_clust2
[1,] 1.340450 1.978224
[2,] 1.607045 1.717490
[3,] 3.545037 3.938316
[4,] 4.647557 5.081306
[5,] 1.570491 2.193004
在 mahalanobi 方法和 mclust 之间有五个观察值被不同地分类。在图中,它们是两个集群之间的中间点。有人能告诉我为什么它不起作用以及我如何模仿 mclust 和 predict.Mclust 的内部分类吗?
【问题讨论】:
标签: r classification cluster-analysis prediction