R 使用聚类分析选择最不相似的个体

R 使用聚类分析选择最不相似的个体,r,cluster-analysis,R,Cluster Analysis,我想对我的数据进行聚类,比如说5个聚类,然后我们需要从所有数据中选择50个关系最不相似的个体。这意味着,如果集群一包含100,集群二包含200,集群三包含400,集群四包含200,集群五包含100,我必须从第一个集群中选择5+10,从第二个集群中选择+20,从第三个集群中选择+10,从第四个集群中选择+5,从第五个集群中选择+5 数据示例: mydata<-matrix(nrow=100,ncol=10,rnorm(1000, mean = 0, sd = 1)) mydata

我想对我的数据进行聚类,比如说5个聚类,然后我们需要从所有数据中选择50个关系最不相似的个体。这意味着,如果集群一包含100,集群二包含200,集群三包含400,集群四包含200,集群五包含100,我必须从第一个集群中选择5+10,从第二个集群中选择+20,从第三个集群中选择+10,从第四个集群中选择+5,从第五个集群中选择+5

数据示例:

     mydata<-matrix(nrow=100,ncol=10,rnorm(1000, mean = 0, sd = 1))

mydata我不确定它是否正是您要搜索的内容,但它可能有帮助:

mydata<-matrix(nrow=100, ncol=10, rnorm(1000, mean = 0, sd = 1))
rownames(mydata) <- paste0("id", 1:100) # some id for identification


# cluster objects and calculate dissimilarity matrix
cl <- cutree(hclust(
  sim <- dist(mydata, diag = TRUE, upper=TRUE)), 5) 

# combine results, take sum to aggregate dissimilarity
res <- data.frame(id=rownames(mydata),
                  cluster=cl, dis_sim=rowSums(as.matrix(sim)))
# order, lowest overall dissimilarity will be first
res <- res[order(res$dis_sim), ] 


# split object
reslist <- split(res, f=res$cluster)


## takes first three items with highest overall dissim.
lapply(reslist, tail, n=3) 

## returns id´s with highest overall dissimilarity, top 20% 
lapply(reslist, function(x, p) tail(x, round(nrow(x)*p)), p=0.2)

mydata关于您的评论,请查找以下代码:

请注意,代码可以在美观和效率方面进行改进。 此外,我还使用了第二个答案,因为如果不是这样的话,问题会变得一团糟

# calculation of centroits based on:
# https://stat.ethz.ch/pipermail/r-help/2006-May/105328.html
cl <- hclust(dist(mydata, diag = TRUE, upper=TRUE))
cent <- tapply(mydata, 
        list(rep(cutree(cl, 5), ncol(mydata)), col(mydata)), mean)
dimnames(cent) <- list(NULL, dimnames(mydata)[[2]])


# add up cluster number and data and split by cluster
newdf <- data.frame(data=mydata, cluster=cutree(cl, k=5))
newdfl <- split(newdf, f=newdf$cluster)

# add centroids and drop cluster info
totaldf <- lapply(1:5, 
           function(i, li, cen) rbind(cen[i, ], li[[i]][ , -11]),
                                li=newdfl, cen=cent)


# calculate new distance to centroits and sort them
dist_to_cent <- lapply(totaldf, function(x)
                   sort(as.matrix(dist(x, diag=TRUE, upper=TRUE))[1, ]))
dist_to_cent
#根据以下内容计算中心:
# https://stat.ethz.ch/pipermail/r-help/2006-May/105328.html

cl您是否需要帮助(包括R命令)来完成此任务,或者需要了解将要使用的流程?这听起来像是一个关于统计学的概念性问题,而不是一个关于R的编程问题。如果是这样的话,这个Q最好迁移到(即stats.SE)。从统计学上讲,我很清楚——我需要关于如何在R代码中实现这一点的帮助——到目前为止,你有哪些R代码?亲爱的Holzben,这真的很有帮助,谢谢你——集群中还有一件事,如何选择最接近簇形心的个体?--再次感谢您的代码和响应谢谢您的时间——基于数据示例,我认为最好使用kmeans并将数据集群到50个集群(因为我想选择50个个体)---然后选择一个离集群中心最近的个体/集群---你认为呢?很抱歉,这么多问题困扰了您。如果您对分析centroits kmeans感兴趣,那么与分层聚类相比,kmeans显然是更自然的选择。。。在我的示例中,我从分层集群开始,因此在第二个示例中也这样做了。你的建议听起来不错,但我不确定你的总体目标是什么。。。。