预测 R 之外的 mclust 集群成员资格

Posted

技术标签:

【中文标题】预测 R 之外的 mclust 集群成员资格【英文标题】:Predict mclust cluster membership outside R 【发布时间】: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 的内部分类吗?

【问题讨论】:

这可能会有所帮助:stat.washington.edu/research/reports/2012/tr597.pdf 【参考方案1】:

提出上述问题后,我做了一些额外的研究(thx LoBu),发现关键是计算一个观察属于某个聚类的后验概率(pp),并根据最大pp进行分类。以下工作:

denom<-rep(0,nrow(d))
pp_matrix<-matrix(rep(NA,nrow(d)*2),nrow=nrow(d))
for(i in 1:2)
  denom<-denom+m$parameters$pro[i]*dmvnorm(d,m$parameters$mean[,i],m$parameters$variance$sigma[,,i])

for(i in 1:2)
  pp_matrix[,i]<-m$parameters$pro[i]*dmvnorm(d,m$parameters$mean[,i],m$parameters$variance$sigma[,,i]) / denom


pp_class<-apply(pp_matrix,1,function(x) 
  match(max(x),x)
)
table(pp_class,m$classification)
#Result:
pp_class   1   2
       1 124   0
       2   0 176

但是,如果有人能以通俗的方式解释 mahalanobi 和 pp 方法之间的区别,我将非常感激。 “混合概率”(m$parameters$pro)是什么意思?

【讨论】:

这个解决方案似乎不是通用的。在 mclust 5.4.7 中运行代码时,我得到一个错误分类的观察结果。测试不同的模型(EII、VII 和 EEI)会产生不同的少量错误分类观察结果,并针对 apply(pp_matrix,1,function(x) 1-max(x)) 绘制 m$uncertainty 表明 mclust 不确定性和计算出的不确定性不同有些。为什么呢?如上例所示,考虑 sigma 和 mean 是否足够,或者 Sigma、Cholsigma、Scale、Orientation 等是否在不同类型的模型规范中发挥作用?【参考方案2】:

除了马氏距离之外,您需要考虑集群权重

当它们重叠时,这些权重集群的相对重要性。

【讨论】:

以上是关于预测 R 之外的 mclust 集群成员资格的主要内容,如果未能解决你的问题,请参考以下文章

R - 预测自定义聚类

模型选择 - mclust

通过间隙统计和预测强度估计集群数量

R - loess 预测返回 NA

Python Scikit Learn GMM 结果与 R Mclust 不一致

R语言:EM算法和高斯混合模型的实现