R语言 更改聚类标签以进行比较

h5qlskok  于 2023-06-19  发布在  其他
关注(0)|答案(2)|浏览(139)

我需要帮助重新定义两个聚类过程的索引,以便它们以更直接的方式进行比较。
假设一个聚类过程A给出了以下向量作为输出(每个个体的聚类标签的向量)

clust1 <- c(1, 1, 1, 1, 3, 2, 2, 1, 1, 2, 3, 2, 2)

而聚类算法B返回以下向量

clust2 <- c(3, 3, 3, 3, 5, 2, 2, 3, 3, 2, 5, 2, 2)

正如您所看到的,这两种算法返回相同的聚类,但如果您有数百个观察结果,则不容易获得此结果。
你能帮助我开发一个自动函数(或一段以通用方式编写的代码),改变两者或两者之一的集群标签,使它们具有相同的标签吗?
我的主要目的不是比较两个聚类,但我需要一个代码,做我所说的,因此请不要试图解决我的问题,只是说,我可以比较他们与一个情节或列联表。
先谢谢你了!

2lpgd968

2lpgd9681#

clust1 <- c(1, 1, 1, 1, 3, 2, 2, 1, 1, 2, 3, 2, 2)
clust2 <- c(3, 3, 3, 3, 5, 2, 2, 3, 3, 2, 5, 2, 2)

这里有一个解决方案,只要两个解决方案之间的簇数相同,它就可以工作。我们使用factor()clust1的标签应用到clust2

clust2_re <- 
  factor(clust2,
       levels = unique(clust2),
       labels = unique(clust1)) |> 
  as.character() |> 
  as.numeric()

clust2_re
#>  [1] 1 1 1 1 3 2 2 1 1 2 3 2 2

all(clust1 == clust2_re)
#> [1] TRUE

此外:igraph有一个compare()函数,它返回聚类结果之间的距离,当聚类标签不同时,该函数也有效。让我们添加第三个聚类变量,并只更改最后一个值...

clust3 <- c(3, 3, 3, 3, 5, 2, 2, 3, 3, 2, 5, 2, 3)

当两个群集解决方案相同时,compare()返回0

library(igraph)
compare(clust1, clust2)
#> [1] 0

无论何时存在差异,结果都将是> 0

compare(clust1, clust3)
#> [1] 0.4132943
but5z9lq

but5z9lq2#

你可以把它们与图或列联表进行比较。
或者,像这样:

relabel <- \(xs) {
  xs <- as.character(xs)
  xs_uniq <- unique(xs)
  hash <- setNames(LETTERS[seq_along(xs_uniq)], xs_uniq)
  as.character(hash[xs])
}
## > relabel(clust1)
## [1] "A" "A" "A" "A" "B" "C" "C" "A" "A" "C" "B" "C" "C"
## > identical(relabel(clust1), relabel(clust2))
## [1] TRUE

相关问题