两个独立样本组的非入侵聚类分析

时间:2014-01-22 06:28:13

标签: r cluster-analysis k-means

我在集群分析方面遇到了一些麻烦。我的想法是,我想分别对两组不同的样本进行聚类,但我想维护一条规则:一个组内的一个簇不能被另一个组的任何簇侵入。这个例子将说明 -

#Let's make type-1 group of samples
x1<-sample(seq(1,1.3,by=0.02))
y1<-sample(seq(3,3.3,by=0.02))
x2<-sample(seq(1.5,1.8,by=0.02))
y2<-sample(seq(3,3.3,by=0.02))
x3<-sample(seq(2.5,2.7,by=0.01))
y3<-sample(seq(4.5,4.7,by=0.01))
x4<-sample(seq(1.5,1.8,by=0.02))
y4<-sample(seq(2.4,2.7,by=0.02))
d1<-rbind(cbind(x1,y1),cbind(x2,y2),cbind(x3,y3),cbind(x4,y4))
d1<-data.frame(d1,type=rep(1,69))

#Let's make type-2 group of samples
x1<-sample(seq(1.3,1.5,by=0.01))
y1<-sample(seq(2.8,3.2,by=0.02))
x2<-sample(seq(2.3,2.4,by=0.005))
y2<-sample(seq(2,2.1,by=0.005))
x3<-sample(seq(2.7,3,by=0.02))
y3<-sample(seq(1.6,1.9,by=0.02))
d2<-rbind(cbind(x1,y1),cbind(x2,y2), cbind(x3,y3))
d2<-data.frame(d2,type=rep(2,58))

#plot them
plot(d1$x1, d1$y1, xlim=c(0,3), ylim=c(1.5,5))
points(d2$x1, d2$y1, col='blue')

enter image description here

The figure清楚地表明,一个类型2样本的集群在3个独立的类型1样本集群内。然而,一组1型明显地聚集在一起。如果我想创建3个集群,该算法会创建一个类型为1的集群,它位于中央蓝色集群的左侧和右侧,一个底部集群,以及一个最远的集群 -

#taking only the coordinates for cluster analysis 
myd1<-d1[,1:2]
myd2<-d2[,1:2]

#clustering using stats package
(cl1 <- kmeans(myd1, 3))
(cl2 <- kmeans(myd2, 3))

plot(myd1, xlim=c(0,3), ylim=c(1.5,5), col=cl1$cluster)
points(myd2, col=cl2$cluster)

但是我希望一个类型为1的集群成为类型2中心集群左侧的集群,一个集群将包含顶部和底部集群,第三个集群具有最远点。通过这种方式,类型1的簇将永远不会侵入类型2的簇。我制作这个虚拟数据只是为了说明这个想法。制作4个类型1的集群肯定会解决问题,但这不能应用于非常复杂的真实数据。谢谢你的建议。

1 个答案:

答案 0 :(得分:0)

群集对我来说绝对不像k-means-clusters。

您的问题听起来像是约束聚类。您的约束是不同组成员之间的必须不链接约束。

对“非侵入”要求的最明显的解决方案是拆分数据集,并分别对每个部分进行聚类。这听起来很无聊,但保证完全符合您的要求。

您可能还想查看广义DBSCAN。可以定义GDBSCAN中的邻居谓词以考虑组成员身份。即邻居只是同一组的成员。但同样,这可能等于在每个分区上运行DBSCAN,然后加入两个噪声 clusters 集。